diff options
Diffstat (limited to 'subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/NodeNameProvider.java')
-rw-r--r-- | subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/NodeNameProvider.java | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/NodeNameProvider.java b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/NodeNameProvider.java new file mode 100644 index 00000000..517b8604 --- /dev/null +++ b/subprojects/language-semantics/src/main/java/tools/refinery/language/semantics/NodeNameProvider.java | |||
@@ -0,0 +1,62 @@ | |||
1 | /* | ||
2 | * SPDX-FileCopyrightText: 2024 The Refinery Authors <https://refinery.tools/> | ||
3 | * | ||
4 | * SPDX-License-Identifier: EPL-2.0 | ||
5 | */ | ||
6 | package tools.refinery.language.semantics; | ||
7 | |||
8 | import com.google.inject.Inject; | ||
9 | import org.eclipse.collections.api.factory.primitive.ObjectIntMaps; | ||
10 | import org.eclipse.collections.api.map.primitive.MutableObjectIntMap; | ||
11 | import org.eclipse.xtext.naming.IQualifiedNameConverter; | ||
12 | import org.eclipse.xtext.naming.QualifiedName; | ||
13 | import org.eclipse.xtext.scoping.IScopeProvider; | ||
14 | import tools.refinery.language.model.problem.Node; | ||
15 | import tools.refinery.language.model.problem.Problem; | ||
16 | import tools.refinery.language.model.problem.ProblemPackage; | ||
17 | |||
18 | import java.util.Locale; | ||
19 | |||
20 | public class NodeNameProvider { | ||
21 | @Inject | ||
22 | private IQualifiedNameConverter qualifiedNameConverter; | ||
23 | |||
24 | @Inject | ||
25 | private SemanticsUtils semanticsUtils; | ||
26 | |||
27 | @Inject | ||
28 | private IScopeProvider scopeProvider; | ||
29 | |||
30 | private Problem problem; | ||
31 | private final MutableObjectIntMap<String> indexMap = ObjectIntMaps.mutable.empty(); | ||
32 | |||
33 | public void setProblem(Problem problem) { | ||
34 | if (this.problem != null) { | ||
35 | throw new IllegalStateException("Problem was already set"); | ||
36 | } | ||
37 | this.problem = problem; | ||
38 | } | ||
39 | |||
40 | public String getNextName(String typeName) { | ||
41 | if (problem == null) { | ||
42 | throw new IllegalStateException("Problem was not set"); | ||
43 | } | ||
44 | String namePrefix; | ||
45 | if (typeName == null || typeName.isEmpty()) { | ||
46 | namePrefix = "node"; | ||
47 | } else { | ||
48 | namePrefix = typeName.substring(0, 1).toLowerCase(Locale.ROOT) + typeName.substring(1); | ||
49 | } | ||
50 | int index = indexMap.getIfAbsent(namePrefix, 0); | ||
51 | String nodeName; | ||
52 | QualifiedName qualifiedName; | ||
53 | var scope = scopeProvider.getScope(problem, ProblemPackage.Literals.NODE_ASSERTION_ARGUMENT__NODE); | ||
54 | do { | ||
55 | index++; | ||
56 | nodeName = namePrefix + index; | ||
57 | qualifiedName = qualifiedNameConverter.toQualifiedName(nodeName); | ||
58 | } while (semanticsUtils.maybeGetElement(problem, scope, qualifiedName, Node.class) != null); | ||
59 | indexMap.put(namePrefix, index); | ||
60 | return nodeName; | ||
61 | } | ||
62 | } | ||