Skip to content

Commit 1ea941f

Browse files
committed
fix: return inheritance support to ast processor
1 parent dffb379 commit 1ea941f

File tree

3 files changed

+33
-34
lines changed

3 files changed

+33
-34
lines changed

server/common/src/main/java/org/eclipse/lsp/cobol/common/processor/ProcessingContext.java

+19-8
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
public class ProcessingContext {
3434
private final Map<
3535
ProcessingPhase,
36-
Map<Class<? extends Node>, List<Processor<? extends Node>>>>
36+
List<Map.Entry<Class<? extends Node>, List<Processor<? extends Node>>>>>
3737
processors = new HashMap<>();
3838

3939
final List<SyntaxError> errors;
@@ -57,15 +57,26 @@ public ProgramNode getCurrentProgramNode() {
5757
* @param processorDesc Processor descriptor.
5858
*/
5959
public void register(ProcessorDescription processorDesc) {
60-
if (Modifier.isAbstract(processorDesc.getNodeClass().getModifiers())) {
61-
throw new RuntimeException("Can't register processor for node class: "
62-
+ processorDesc.getNodeClass().getName() + ". Node class should be concrete.");
60+
List<Map.Entry<Class<? extends Node>, List<Processor<? extends Node>>>> ps = processors.computeIfAbsent(processorDesc.getPhase(), v -> new ArrayList<>());
61+
for (Map.Entry<Class<? extends Node>, List<Processor<? extends Node>>> pair : ps) {
62+
if (pair.getKey().isAssignableFrom(processorDesc.getNodeClass())
63+
|| processorDesc.getNodeClass().isAssignableFrom(pair.getKey())) {
64+
if(pair.getValue().contains(processorDesc.processor)) {
65+
throw new RuntimeException("Processor " + processorDesc.getProcessor().getClass().getName()
66+
+ " register twice: for classes " + pair.getKey().getName() + " and " + processorDesc.getNodeClass().getName()
67+
+ " in " + processorDesc.getPhase() + " phase");
68+
}
69+
}
70+
if (pair.getKey().equals(processorDesc.getNodeClass())) {
71+
pair.getValue().add(processorDesc.processor);
72+
return;
73+
}
6374
}
64-
processors
65-
.computeIfAbsent(processorDesc.getPhase(), v -> new HashMap<>())
66-
.computeIfAbsent(processorDesc.getNodeClass(), v -> new ArrayList<>())
67-
.add(processorDesc.getProcessor());
75+
ArrayList<Processor<? extends Node>> pList = new ArrayList<>();
76+
pList.add(processorDesc.processor);
77+
ps.add(new AbstractMap.SimpleEntry<>(processorDesc.getNodeClass(), pList));
6878
}
79+
6980
/**
7081
* Register node type processor
7182
* @param phase processing phase

server/engine/src/main/java/org/eclipse/lsp/cobol/core/engine/processor/AstProcessor.java

+10-6
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
import org.eclipse.lsp.cobol.common.utils.ThreadInterruptionUtil;
2727
import org.eclipse.lsp.cobol.core.engine.analysis.AnalysisContext;
2828

29-
import java.util.Collections;
3029
import java.util.List;
3130
import java.util.Map;
3231

@@ -68,7 +67,7 @@ public List<SyntaxError> processSyntaxTree(AnalysisConfig analysisConfig, Proces
6867
* @param ctx processing context
6968
*/
7069
public void process(ProcessingPhase phase, Node node, ProcessingContext ctx) {
71-
Map<Class<? extends Node>, List<Processor<? extends Node>>> processors = ctx.getProcessors().get(phase);
70+
List<Map.Entry<Class<? extends Node>, List<Processor<? extends Node>>>> processors = ctx.getProcessors().get(phase);
7271
if (processors != null)
7372
process(processors, node, ctx);
7473
}
@@ -80,17 +79,22 @@ public void process(ProcessingPhase phase, Node node, ProcessingContext ctx) {
8079
* @param node a node to process
8180
* @param ctx processing context
8281
*/
83-
private void process(Map<Class<? extends Node>, List<Processor<? extends Node>>> processors,
84-
Node node, ProcessingContext ctx) {
82+
private void process(List<Map.Entry<Class<? extends Node>, List<Processor<? extends Node>>>> processors,
83+
Node node, ProcessingContext ctx) {
8584
ThreadInterruptionUtil.checkThreadInterrupted();
8685
final Class<? extends Node> nodeClass = node.getClass();
8786
if (nodeClass == ProgramNode.class) {
8887
ctx.getCurrentProgramNodeStack().push((ProgramNode) node);
8988
}
9089
try {
91-
for (Processor<? extends Node> processor : processors.getOrDefault(nodeClass, Collections.emptyList())) {
92-
((Processor<Node>) processor).accept(node, ctx);
90+
for (Map.Entry<Class<? extends Node>, List<Processor<? extends Node>>> proc: processors) {
91+
if (proc.getKey().isAssignableFrom(nodeClass)) {
92+
for (Processor<? extends Node> processor : proc.getValue()) {
93+
((Processor<Node>) processor).accept(node, ctx);
94+
}
95+
}
9396
}
97+
9498
for (Node n : node.getChildren()) {
9599
process(processors, n, ctx);
96100
}

server/engine/src/main/java/org/eclipse/lsp/cobol/dialects/ibm/TransformTreeStage.java

+4-20
Original file line numberDiff line numberDiff line change
@@ -295,28 +295,12 @@ private void registerProcessors(AnalysisConfig analysisConfig, ProcessingContext
295295
ctx.register(v, StandAloneDataItemNode.class, variableNameCheck);
296296
ctx.register(v, TableDataNameNode.class, variableNameCheck);
297297

298-
StatementValidate processor = new StatementValidate();
299-
ctx.register(v, StatementNode.class, processor);
300-
ctx.register(v, OpenStatementNode.class, processor);
301-
ctx.register(v, SetToStatement.class, processor);
302-
ctx.register(v, JsonParseNode.class, processor);
303-
ctx.register(v, XMLParseNode.class, processor);
304-
ctx.register(v, SetUpDownByStatement.class, processor);
305-
ctx.register(v, SetToOnOffStatement.class, processor);
306-
ctx.register(v, JsonGenerateNode.class, processor);
307-
ctx.register(v, SetToBooleanStatement.class, processor);
308-
ctx.register(v, FileOperationStatementNode.class, processor);
309-
310-
ElementaryNodeCheck elementaryNodeCheck = new ElementaryNodeCheck();
311-
ctx.register(v, ElementaryItemNode.class, elementaryNodeCheck);
312-
ctx.register(v, StandAloneDataItemNode.class, elementaryNodeCheck);
313-
ctx.register(v, TableDataNameNode.class, elementaryNodeCheck);
298+
ctx.register(v, StatementNode.class, new StatementValidate());
314299

315-
ctx.register(v, GroupItemNode.class, new GroupItemCheck());
316-
317-
ObsoleteNodeCheck obsoleteNodeCheck = new ObsoleteNodeCheck();
318-
ctx.register(v, RemarksNode.class, obsoleteNodeCheck);
300+
ctx.register(v, ElementaryNode.class, new ElementaryNodeCheck());
319301

302+
ctx.register(v, GroupItemNode.class, new GroupItemCheck());
303+
ctx.register(v, RemarksNode.class, new ObsoleteNodeCheck());
320304
ctx.register(v, StandAloneDataItemNode.class, new StandAloneDataItemCheck());
321305
ctx.register(v, ProcedureDivisionNode.class, new FunctionReturningClauseCheck());
322306
ctx.register(v, ProgramEndNode.class, new ProgramEndCheck());

0 commit comments

Comments
 (0)