Skip to content

Commit 97862ff

Browse files
activity diagram resolver
1 parent 984c907 commit 97862ff

14 files changed

Lines changed: 916 additions & 1 deletion

File tree

plantuml/parser/integration_test/activity_diagram/activity_diagram.puml renamed to plantuml/parser/integration_test/activity_diagram/resolver/activity_it/activity_diagram.puml

File renamed without changes.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
activity_diagram.puml:
2+
error:
3+
type: NotImplemented

plantuml/parser/integration_test/src/test_error_view.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use puml_parser::{
1717
ActivityParserError, BaseParseError, ClassError, IncludeExpandError, IncludeParseError,
1818
PreprocessError, ProcedureExpandError, ProcedureParseError,
1919
};
20-
use puml_resolver::{ClassPumlResolverError, ElementResolverError};
20+
use puml_resolver::{ActivityResolverError, ClassPumlResolverError, ElementResolverError};
2121

2222
#[derive(Debug)]
2323
pub struct ProjectedError {
@@ -244,6 +244,14 @@ impl ErrorView for ElementResolverError {
244244
}
245245
}
246246

247+
impl ErrorView for ActivityResolverError {
248+
fn project(&self, _base_dir: &Path) -> ProjectedError {
249+
match self {
250+
ActivityResolverError::NotImplemented => ProjectedError::new("NotImplemented"),
251+
}
252+
}
253+
}
254+
247255
impl ErrorView for ClassPumlResolverError {
248256
fn project(&self, _base_dir: &Path) -> ProjectedError {
249257
match self {

plantuml/parser/puml_parser/src/grammar/activity.pest

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ statement = _{
4545
| while_start_stmt
4646

4747
// base
48+
| title_stmt
4849
| note_declaration
4950
| backward_stmt
5051
| arrow_stmt

plantuml/parser/puml_resolver/BUILD

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,20 @@ rust_library(
1717
srcs = ["src/lib.rs"],
1818
visibility = ["//plantuml/parser:__subpackages__"],
1919
deps = [
20+
":activity_resolver",
2021
":class_resolver",
2122
":component_resolver",
2223
":resolver_traits",
2324
":sequence_resolver",
2425
],
2526
)
2627

28+
alias(
29+
name = "activity_resolver",
30+
actual = "//plantuml/parser/puml_resolver/src/activity_diagram:puml_resolver_activity",
31+
visibility = ["//plantuml/parser:__subpackages__"],
32+
)
33+
2734
alias(
2835
name = "component_resolver",
2936
actual = "//plantuml/parser/puml_resolver/src/component_diagram:puml_resolver_component",
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# *******************************************************************************
2+
# Copyright (c) 2026 Contributors to the Eclipse Foundation
3+
#
4+
# See the NOTICE file(s) distributed with this work for additional
5+
# information regarding copyright ownership.
6+
#
7+
# This program and the accompanying materials are made available under the
8+
# terms of the Apache License Version 2.0 which is available at
9+
# https://www.apache.org/licenses/LICENSE-2.0
10+
#
11+
# SPDX-License-Identifier: Apache-2.0
12+
# *******************************************************************************
13+
load("@rules_rust//rust:defs.bzl", "rust_library", "rust_test")
14+
15+
rust_library(
16+
name = "puml_resolver_activity",
17+
srcs = [
18+
"src/activity_logic.rs",
19+
"src/activity_resolver.rs",
20+
"src/lib.rs",
21+
],
22+
crate_name = "activity_resolver",
23+
crate_root = "src/lib.rs",
24+
visibility = ["//plantuml/parser:__subpackages__"],
25+
deps = [
26+
"//plantuml/parser/puml_parser:activity_diagram",
27+
"//plantuml/parser/puml_resolver:resolver_traits",
28+
"@crates//:serde",
29+
"@crates//:thiserror",
30+
],
31+
)
32+
33+
rust_test(
34+
name = "puml_resolver_activity_it",
35+
srcs = [
36+
"tests/activity_resolver_test.rs",
37+
],
38+
crate_root = "tests/activity_resolver_test.rs",
39+
data = [
40+
"//plantuml/parser/integration_test/activity_diagram:activity_diagram_files",
41+
],
42+
visibility = ["//plantuml/parser:__subpackages__"],
43+
deps = [
44+
":puml_resolver_activity",
45+
"//plantuml/parser/integration_test:test_framework",
46+
"//plantuml/parser/puml_parser:activity_diagram",
47+
"//plantuml/parser/puml_parser:parser_core",
48+
"//plantuml/parser/puml_resolver:resolver_traits",
49+
"//plantuml/parser/puml_utils",
50+
],
51+
)
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
@startuml activity_AST
2+
3+
skinparam classAttributeIconSize 0
4+
hide empty members
5+
6+
class ActivityDiagram {
7+
+name: Option<String>
8+
+statements: Vec<ActivityStmt>
9+
}
10+
11+
abstract class ActivityStmt
12+
13+
class ActionNode {
14+
+label: String
15+
}
16+
17+
class IfNode {
18+
+condition: String
19+
+body: Vec<ActivityStmt>
20+
+orelse: Vec<ActivityStmt>
21+
}
22+
23+
class WhileNode {
24+
+condition: String
25+
+body: Vec<ActivityStmt>
26+
+backward: Option<BackwardNode>
27+
}
28+
29+
class RepeatNode {
30+
+body: Vec<ActivityStmt>
31+
+condition: String
32+
+backward: Option<BackwardNode>
33+
}
34+
35+
class BackwardNode {
36+
+label: String
37+
}
38+
39+
class ControlNode {
40+
+kind: Stop | Kill | Detach | Break | Continue
41+
}
42+
43+
ActivityDiagram *-- "0..*" ActivityStmt : statements
44+
45+
ActivityStmt <|-- ActionNode
46+
ActivityStmt <|-- IfNode
47+
ActivityStmt <|-- WhileNode
48+
ActivityStmt <|-- RepeatNode
49+
ActivityStmt <|-- ControlNode
50+
51+
IfNode *-- "0..*" ActivityStmt : body
52+
IfNode *-- "0..*" ActivityStmt : orelse
53+
WhileNode *-- "0..*" ActivityStmt : body
54+
WhileNode o-- "0..1" BackwardNode : backward
55+
RepeatNode *-- "0..*" ActivityStmt : body
56+
RepeatNode o-- "0..1" BackwardNode : backward
57+
58+
@enduml
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
@startuml activity_cfg
2+
3+
skinparam classAttributeIconSize 0
4+
hide empty members
5+
6+
class ActivityCfg {
7+
+entry: NodeId
8+
+exit: NodeId
9+
+nodes: Vec<CfgNode>
10+
+edges: Vec<CfgEdge>
11+
}
12+
13+
abstract class CfgNode {
14+
+id: NodeId
15+
}
16+
17+
class EntryNode
18+
class ExitNode
19+
20+
class StepNode {
21+
+label: String
22+
+kind: StepKind
23+
}
24+
25+
class DecisionNode {
26+
+condition: String
27+
}
28+
29+
class MergeNode
30+
31+
class CfgEdge {
32+
+from: NodeId
33+
+to: NodeId
34+
+kind: EdgeKind
35+
}
36+
37+
enum StepKind {
38+
Action
39+
Backward
40+
Control
41+
}
42+
43+
enum EdgeKind {
44+
Next
45+
True
46+
False
47+
Back
48+
Break
49+
Continue
50+
Abort
51+
}
52+
53+
ActivityCfg *-- "1..*" CfgNode : nodes
54+
ActivityCfg *-- "0..*" CfgEdge : edges
55+
56+
CfgNode <|-- EntryNode
57+
CfgNode <|-- ExitNode
58+
CfgNode <|-- StepNode
59+
CfgNode <|-- DecisionNode
60+
CfgNode <|-- MergeNode
61+
62+
@enduml

0 commit comments

Comments
 (0)