AS3 error highligter - show multiple errors

This commit is contained in:
Jindra Petřík
2025-05-29 21:17:51 +02:00
parent e06756b32a
commit e9db3273e8
5 changed files with 461 additions and 557 deletions

View File

@@ -17,6 +17,8 @@
package com.jpexs.decompiler.flash.simpleparser;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
@@ -25,7 +27,7 @@ import java.util.Map;
* @author JPEXS
*/
public interface SimpleParser {
/**
* Parses document.
*
@@ -43,4 +45,67 @@ public interface SimpleParser {
Map<Integer, Integer> referenceToDefinition,
List<SimpleParseException> errors
) throws SimpleParseException, IOException, InterruptedException;
public static void parseVariablesList(
List<VariableOrScope> privateVariables,
List<VariableOrScope> sharedVariables,
Map<Integer, List<Integer>> definitionPosToReferences,
Map<Integer, Integer> referenceToDefinition,
Map<String, Integer> parentVarNameToDefinitionPosition
) {
Map<String, Integer> privateVarNameToDefinitionPosition = new LinkedHashMap<>();
privateVarNameToDefinitionPosition.putAll(parentVarNameToDefinitionPosition);
for (VariableOrScope vt : privateVariables) {
if (vt instanceof Variable) {
Variable v = (Variable) vt;
if (v.definition) {
privateVarNameToDefinitionPosition.put(v.name, v.position);
definitionPosToReferences.put(v.position, new ArrayList<>());
} else {
if (!privateVarNameToDefinitionPosition.containsKey(v.name)) {
parentVarNameToDefinitionPosition.put(v.name, -v.position - 1);
privateVarNameToDefinitionPosition.put(v.name, -v.position - 1);
definitionPosToReferences.put(-v.position - 1, new ArrayList<>());
definitionPosToReferences.get(-v.position - 1).add(v.position);
referenceToDefinition.put(v.position, -v.position - 1);
} else {
int definitionPos = privateVarNameToDefinitionPosition.get(v.name);
definitionPosToReferences.get(definitionPos).add(v.position);
referenceToDefinition.put(v.position, definitionPos);
}
}
}
if (vt instanceof Scope) {
Scope vs = (Scope) vt;
parseVariablesList(vs.getPrivateItems(), vs.getSharedItems(), definitionPosToReferences, referenceToDefinition, privateVarNameToDefinitionPosition);
}
}
for (VariableOrScope vt : sharedVariables) {
if (vt instanceof Variable) {
Variable v = (Variable) vt;
if (v.definition) {
parentVarNameToDefinitionPosition.put(v.name, v.position);
privateVarNameToDefinitionPosition.put(v.name, v.position);
definitionPosToReferences.put(v.position, new ArrayList<>());
} else {
if (!privateVarNameToDefinitionPosition.containsKey(v.name)) {
parentVarNameToDefinitionPosition.put(v.name, -v.position - 1);
privateVarNameToDefinitionPosition.put(v.name, -v.position - 1);
definitionPosToReferences.put(-v.position - 1, new ArrayList<>());
definitionPosToReferences.get(-v.position - 1).add(v.position);
referenceToDefinition.put(v.position, -v.position - 1);
} else {
int definitionPos = privateVarNameToDefinitionPosition.get(v.name);
definitionPosToReferences.get(definitionPos).add(v.position);
referenceToDefinition.put(v.position, definitionPos);
}
}
}
if (vt instanceof Scope) {
Scope vs = (Scope) vt;
parseVariablesList(vs.getPrivateItems(), vs.getSharedItems(), definitionPosToReferences, referenceToDefinition, privateVarNameToDefinitionPosition);
}
}
}
}