From 53b8279ce56570fe6d8bd953c85ebde36acf15f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 15 Jun 2025 01:24:18 +0200 Subject: [PATCH] Static vs non static suggestions --- .../abc/avm2/parser/script/AbcIndexing.java | 2 +- .../script/ActionScript3SimpleParser.java | 3 +- .../script/ActionScript2SimpleParser.java | 3 +- .../flash/simpleparser/SimpleParser.java | 47 +++++++++++++++---- .../flash/gui/editor/VariableMarker.java | 31 +++++++++++- 5 files changed, 71 insertions(+), 15 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AbcIndexing.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AbcIndexing.java index a284c52ff..25ef024ad 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AbcIndexing.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AbcIndexing.java @@ -662,7 +662,7 @@ public final class AbcIndexing { continue; } if (Objects.equals(def.parent, ciName)) { - ret.add(def.propName); + ret.add("static::" + def.propName); } } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3SimpleParser.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3SimpleParser.java index bdf32025a..b251e5c26 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3SimpleParser.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3SimpleParser.java @@ -2297,6 +2297,7 @@ public class ActionScript3SimpleParser implements SimpleParser { Map referenceToExternalTraitKey, Map> externalTraitKeyToReference, Map separatorPosToType, + Map separatorIsStatic, Map> localTypeTraitNames, Map definitionToType, Map definitionToCallType @@ -2319,7 +2320,7 @@ public class ActionScript3SimpleParser implements SimpleParser { //Logger.getLogger(ActionScript3SimpleParser.class.getName()).log(Level.SEVERE, null, ex); throw new SimpleParseException(str, ex.line); } - SimpleParser.parseVariablesList(new ArrayList<>(), vars, definitionPosToReferences, referenceToDefinition, errors, true, externalTypes, referenceToExternalTypeIndex, externalTypeIndexToReference, linkHandler, referenceToExternalTraitKey, externalTraitKeyToReference, separatorPosToType, localTypeTraitNames, definitionToType, definitionToCallType); + SimpleParser.parseVariablesList(new ArrayList<>(), vars, definitionPosToReferences, referenceToDefinition, errors, true, externalTypes, referenceToExternalTypeIndex, externalTypeIndexToReference, linkHandler, referenceToExternalTraitKey, externalTraitKeyToReference, separatorPosToType, separatorIsStatic, localTypeTraitNames, definitionToType, definitionToCallType); } /** diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2SimpleParser.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2SimpleParser.java index 6b552e354..0e0d6a8f7 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2SimpleParser.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2SimpleParser.java @@ -1582,6 +1582,7 @@ public class ActionScript2SimpleParser implements SimpleParser { Map referenceToExternalTraitKey, Map> externalTraitKeyToReference, Map separatorPosToType, + Map separatorIsStatic, Map> localTypeTraitNames, Map definitionToType, Map definitionToCallType @@ -1675,7 +1676,7 @@ public class ActionScript2SimpleParser implements SimpleParser { } catch (ActionParseException ex) { errors.add(new SimpleParseException(ex.getMessage(), ex.line, ex.position)); } - SimpleParser.parseVariablesList(new ArrayList<>(), vars, definitionPosToReferences, referenceToDefinition, errors, false, externalTypes, referenceToExternalTypeIndex, externalTypeIndexToReference, linkHandler, referenceToExternalTraitKey, externalTraitKeyToReference, separatorPosToType, localTypeTraitNames, definitionToType, definitionToCallType); + SimpleParser.parseVariablesList(new ArrayList<>(), vars, definitionPosToReferences, referenceToDefinition, errors, false, externalTypes, referenceToExternalTypeIndex, externalTypeIndexToReference, linkHandler, referenceToExternalTraitKey, externalTraitKeyToReference, separatorPosToType, separatorIsStatic, localTypeTraitNames, definitionToType, definitionToCallType); } private void versionRequired(List errors, ParsedSymbol s, int min) throws SimpleParseException { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/simpleparser/SimpleParser.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/simpleparser/SimpleParser.java index 5c99377c1..926029a99 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/simpleparser/SimpleParser.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/simpleparser/SimpleParser.java @@ -60,6 +60,7 @@ public interface SimpleParser { Map referenceToExternalTraitKey, Map> externalTraitKeyToReference, Map separatorPosToType, + Map separatorIsStatic, Map> localTypeTraitNames, Map definitionToType, Map definitionToCallType @@ -79,7 +80,8 @@ public interface SimpleParser { Map referenceToExternalTraitKey, Map> externalTraitKeyToReference, Map separatorPosToType, - Map> localTypeTraitNames, + Map separatorIsStatic, + Map> localTypeTraitNames, Map definitionToType, Map definitionToCallType ) { @@ -101,15 +103,20 @@ public interface SimpleParser { findClassTraits(sharedVariables, traitFullNameToDefinition, definitionPosToReferences, positionToStatic, definitionToType, definitionToCallType, definitionToSubType, definitionToCallSubType); for (Path p : traitFullNameToDefinition.keySet()) { + int definition = traitFullNameToDefinition.get(p); + boolean isStatic = false; + if (positionToStatic.containsKey(definition) && positionToStatic.get(definition)) { + isStatic = true; + } Path cls = p.getParent(); String traitName = p.getLast().toString(); if (!localTypeTraitNames.containsKey(cls)) { localTypeTraitNames.put(cls, new ArrayList<>()); } - localTypeTraitNames.get(cls).add(traitName); + localTypeTraitNames.get(cls).add((isStatic ? "static::" : "") + traitName); } - parseVariablesList(privateVariables, sharedVariables, definitionPosToReferences, referenceToDefinition, new LinkedHashMap<>(), new LinkedHashMap<>(), positionToStatic, true, errors, null, innerFunctionCanUseTraits, externalSimpleTypes, externalTypes, referenceToExternalTypeIndex, definitionToType, definitionToCallType, definitionToSubType, definitionToCallSubType, traitFullNameToDefinition, linkHandler, simpleExternalClassNameToFullClassName, referenceToExternalTraitKey, externalTraitKeyToReference, separatorPosToType); + parseVariablesList(privateVariables, sharedVariables, definitionPosToReferences, referenceToDefinition, new LinkedHashMap<>(), new LinkedHashMap<>(), positionToStatic, true, errors, null, innerFunctionCanUseTraits, externalSimpleTypes, externalTypes, referenceToExternalTypeIndex, definitionToType, definitionToCallType, definitionToSubType, definitionToCallSubType, traitFullNameToDefinition, linkHandler, simpleExternalClassNameToFullClassName, referenceToExternalTraitKey, externalTraitKeyToReference, separatorPosToType, separatorIsStatic); for (Map.Entry entry : referenceToExternalTypeIndex.entrySet()) { if (!externalTypeIndexToReference.containsKey(entry.getValue())) { externalTypeIndexToReference.put(entry.getValue(), new ArrayList<>()); @@ -142,7 +149,8 @@ public interface SimpleParser { Map simpleExternalClassNameToFullClassName, Map referenceToExternalTraitKey, Map> externalTraitKeyToReference, - Map separatorPosToType + Map separatorPosToType, + Map separatorIsStatic ) { Map privateVarNameToDefinitionPosition = new LinkedHashMap<>(); privateVarNameToDefinitionPosition.putAll(parentVarNameToDefinitionPosition); @@ -153,7 +161,7 @@ public interface SimpleParser { for (VariableOrScope vt : privateVariables) { if (vt instanceof Separator) { Separator s = (Separator) vt; - searchTrait(s.parentName, s.position, true, separatorPosToType, privateVarFullNameToDefinitionPosition, privateVarNameToDefinitionPosition, definitionToType, definitionToCallType, definitionToSubType, definitionToCallSubType, traitFullNameToDefinition, definitionPosToReferences, referenceToDefinition, linkHandler, simpleExternalClassNameToFullClassName, referenceToExternalTraitKey, externalTraitKeyToReference); + searchTrait(s.parentName, s.position, true, separatorPosToType, separatorIsStatic, privateVarFullNameToDefinitionPosition, privateVarNameToDefinitionPosition, definitionToType, definitionToCallType, definitionToSubType, definitionToCallSubType, traitFullNameToDefinition, definitionPosToReferences, referenceToDefinition, linkHandler, simpleExternalClassNameToFullClassName, referenceToExternalTraitKey, externalTraitKeyToReference); } if (vt instanceof Variable) { Variable v = (Variable) vt; @@ -179,7 +187,7 @@ public interface SimpleParser { } else if (externalSimpleTypes.contains(v.name)) { referenceToExternalTypeIndex.put(v.position, externalSimpleTypes.indexOf(v.name)); } else { - boolean traitFound = searchTrait(v.name, v.position, false, separatorPosToType, privateVarFullNameToDefinitionPosition, privateVarNameToDefinitionPosition, definitionToType, definitionToCallType, definitionToSubType, definitionToCallSubType, traitFullNameToDefinition, definitionPosToReferences, referenceToDefinition, linkHandler, simpleExternalClassNameToFullClassName, referenceToExternalTraitKey, externalTraitKeyToReference); + boolean traitFound = searchTrait(v.name, v.position, false, separatorPosToType, separatorIsStatic, privateVarFullNameToDefinitionPosition, privateVarNameToDefinitionPosition, definitionToType, definitionToCallType, definitionToSubType, definitionToCallSubType, traitFullNameToDefinition, definitionPosToReferences, referenceToDefinition, linkHandler, simpleExternalClassNameToFullClassName, referenceToExternalTraitKey, externalTraitKeyToReference); if (!traitFound) { parentVarFullNameToDefinitionPosition.put(v.name, -v.position - 1); parentVarNameToDefinitionPosition.put(v.getLastName(), -v.position - 1); @@ -242,13 +250,13 @@ public interface SimpleParser { } } - parseVariablesList(vs.getPrivateItems(), vs.getSharedItems(), definitionPosToReferences, referenceToDefinition, subPrivateVarFullNameToDefinitionPosition, subPrivateVarNameToDefinitionPosition, positionToStatic, subStatic, errors, vs, innerFunctionCanUseTraits, externalSimpleTypes, externalFullTypes, referenceToExternalTypeIndex, definitionToType, definitionToCallType, definitionToSubType, definitionToCallSubType, traitFullNameToDefinition, linkHandler, simpleExternalClassNameToFullClassName, referenceToExternalTraitKey, externalTraitKeyToReference, separatorPosToType); + parseVariablesList(vs.getPrivateItems(), vs.getSharedItems(), definitionPosToReferences, referenceToDefinition, subPrivateVarFullNameToDefinitionPosition, subPrivateVarNameToDefinitionPosition, positionToStatic, subStatic, errors, vs, innerFunctionCanUseTraits, externalSimpleTypes, externalFullTypes, referenceToExternalTypeIndex, definitionToType, definitionToCallType, definitionToSubType, definitionToCallSubType, traitFullNameToDefinition, linkHandler, simpleExternalClassNameToFullClassName, referenceToExternalTraitKey, externalTraitKeyToReference, separatorPosToType, separatorIsStatic); } } for (VariableOrScope vt : sharedVariables) { if (vt instanceof Separator) { Separator s = (Separator) vt; - searchTrait(s.parentName, s.position, true, separatorPosToType, privateVarFullNameToDefinitionPosition, privateVarNameToDefinitionPosition, definitionToType, definitionToCallType, definitionToSubType, definitionToCallSubType, traitFullNameToDefinition, definitionPosToReferences, referenceToDefinition, linkHandler, simpleExternalClassNameToFullClassName, referenceToExternalTraitKey, externalTraitKeyToReference); + searchTrait(s.parentName, s.position, true, separatorPosToType, separatorIsStatic, privateVarFullNameToDefinitionPosition, privateVarNameToDefinitionPosition, definitionToType, definitionToCallType, definitionToSubType, definitionToCallSubType, traitFullNameToDefinition, definitionPosToReferences, referenceToDefinition, linkHandler, simpleExternalClassNameToFullClassName, referenceToExternalTraitKey, externalTraitKeyToReference); } if (vt instanceof Variable) { Variable v = (Variable) vt; @@ -276,7 +284,7 @@ public interface SimpleParser { } else if (externalSimpleTypes.contains(v.name)) { referenceToExternalTypeIndex.put(v.position, externalSimpleTypes.indexOf(v.name)); } else { - boolean traitFound = searchTrait(v.name, v.position, false, separatorPosToType, privateVarFullNameToDefinitionPosition, privateVarNameToDefinitionPosition, definitionToType, definitionToCallType, definitionToSubType, definitionToCallSubType, traitFullNameToDefinition, definitionPosToReferences, referenceToDefinition, linkHandler, simpleExternalClassNameToFullClassName, referenceToExternalTraitKey, externalTraitKeyToReference); + boolean traitFound = searchTrait(v.name, v.position, false, separatorPosToType, separatorIsStatic, privateVarFullNameToDefinitionPosition, privateVarNameToDefinitionPosition, definitionToType, definitionToCallType, definitionToSubType, definitionToCallSubType, traitFullNameToDefinition, definitionPosToReferences, referenceToDefinition, linkHandler, simpleExternalClassNameToFullClassName, referenceToExternalTraitKey, externalTraitKeyToReference); if (!traitFound) { parentVarFullNameToDefinitionPosition.put(v.name, -v.position - 1); parentVarNameToDefinitionPosition.put(v.getFirstName(), -v.position - 1); @@ -339,7 +347,7 @@ public interface SimpleParser { } } - parseVariablesList(vs.getPrivateItems(), vs.getSharedItems(), definitionPosToReferences, referenceToDefinition, privateVarFullNameToDefinitionPosition, privateVarNameToDefinitionPosition, positionToStatic, subStatic, errors, vs, innerFunctionCanUseTraits, externalSimpleTypes, externalFullTypes, referenceToExternalTypeIndex, definitionToType, definitionToCallType, definitionToSubType, definitionToCallSubType, traitFullNameToDefinition, linkHandler, simpleExternalClassNameToFullClassName, referenceToExternalTraitKey, externalTraitKeyToReference, separatorPosToType); + parseVariablesList(vs.getPrivateItems(), vs.getSharedItems(), definitionPosToReferences, referenceToDefinition, privateVarFullNameToDefinitionPosition, privateVarNameToDefinitionPosition, positionToStatic, subStatic, errors, vs, innerFunctionCanUseTraits, externalSimpleTypes, externalFullTypes, referenceToExternalTypeIndex, definitionToType, definitionToCallType, definitionToSubType, definitionToCallSubType, traitFullNameToDefinition, linkHandler, simpleExternalClassNameToFullClassName, referenceToExternalTraitKey, externalTraitKeyToReference, separatorPosToType, separatorIsStatic); } } } @@ -355,6 +363,12 @@ public interface SimpleParser { Map definitionToCallSubType ) { for (VariableOrScope v : variables) { + if (v instanceof Type) { + Type t = (Type) v; + if (t.definition) { + definitionToType.put(t.position, t.name); + } + } if (v instanceof ClassTrait) { ClassTrait ct = (ClassTrait) v; definitionPosToReferences.put(ct.position, new ArrayList<>()); @@ -386,6 +400,7 @@ public interface SimpleParser { int vPosition, boolean separator, Map separatorPosToType, + Map separatorIsStatic, Map privateVarFullNameToDefinitionPosition, Map privateVarNameToDefinitionPosition, Map definitionToType, @@ -413,12 +428,17 @@ public interface SimpleParser { definitionPos = privateVarNameToDefinitionPosition.get(firstName); } Path type = null; + boolean isStatic = false; if (definitionPos != null) { if (definitionToType.containsKey(definitionPos)) { type = definitionToType.get(definitionPos); + if (type.getLast().equals(firstName)) { + isStatic = true; + } } } else if (simpleExternalClassNameToFullClassName.containsKey(firstName)) { type = simpleExternalClassNameToFullClassName.get(firstName); + isStatic = true; } if (type != null) { traitFound = true; @@ -527,6 +547,7 @@ public interface SimpleParser { } if (separator) { separatorPosToType.put(vPosition, type); + separatorIsStatic.put(vPosition, isStatic); } } } @@ -539,12 +560,17 @@ public interface SimpleParser { definitionPos = privateVarNameToDefinitionPosition.get(firstName); } Path type = null; + boolean isStatic = false; if (definitionPos != null) { if (definitionToType.containsKey(definitionPos)) { type = definitionToType.get(definitionPos); + if (type.getLast().equals(firstName)) { + isStatic = true; + } } } else if (simpleExternalClassNameToFullClassName.containsKey(firstName)) { type = simpleExternalClassNameToFullClassName.get(firstName); + isStatic = true; } if (type != null) { if (definitionPos != null) { @@ -559,6 +585,7 @@ public interface SimpleParser { referenceToExternalTraitKey.put(vPosition, traitKey); }*/ separatorPosToType.put(vPosition, type); + separatorIsStatic.put(vPosition, isStatic); } } return traitFound; diff --git a/src/com/jpexs/decompiler/flash/gui/editor/VariableMarker.java b/src/com/jpexs/decompiler/flash/gui/editor/VariableMarker.java index e4120f69f..060df41fd 100644 --- a/src/com/jpexs/decompiler/flash/gui/editor/VariableMarker.java +++ b/src/com/jpexs/decompiler/flash/gui/editor/VariableMarker.java @@ -128,6 +128,7 @@ public class VariableMarker implements SyntaxComponent, CaretListener, PropertyC private Map> localTypeTraitNames = new LinkedHashMap<>(); private Map definitionToType = new LinkedHashMap<>(); private Map definitionToCallType = new LinkedHashMap<>(); + private Map separatorIsStatic = new LinkedHashMap<>(); private MouseMotionAdapter mouseMotionAdapter; @@ -578,12 +579,35 @@ public class VariableMarker implements SyntaxComponent, CaretListener, PropertyC List suggestions = new ArrayList<>(); if (separatorPosToType.containsKey(pos)) { Path type = separatorPosToType.get(pos); + + boolean isStatic = false; + if (separatorIsStatic.containsKey(pos) && separatorIsStatic.get(pos)) { + isStatic = true; + } + if (localTypeTraitNames.containsKey(type)) { - suggestions.addAll(localTypeTraitNames.get(type)); + for (String traitName : localTypeTraitNames.get(type)) { + if (isStatic && !traitName.startsWith("static::")) { + continue; + } + if (traitName.startsWith("static::")) { + traitName = traitName.substring("static::".length()); + } + suggestions.add(traitName); + } suggestions.remove(type.getLast().toString()); //remove constructor } else { //type = externalTypes.get(referenceToExternalTypeIndex.get(pos)); - suggestions.addAll(((LineMarkedEditorPane) pane).getLinkHandler().getClassTraitNames(type, true, true, true)); + List traitNames = ((LineMarkedEditorPane) pane).getLinkHandler().getClassTraitNames(type, true, true, true); + for (String traitName : traitNames) { + if (isStatic && !traitName.startsWith("static::")) { + continue; + } + if (traitName.startsWith("static::")) { + traitName = traitName.substring("static::".length()); + } + suggestions.add(traitName); + } suggestions.remove(type.getLast().toString()); //remove constructor } } @@ -962,6 +986,7 @@ public class VariableMarker implements SyntaxComponent, CaretListener, PropertyC Map> newLocalTypeTraitNames = new LinkedHashMap<>(); Map newDefinitionToType = new LinkedHashMap<>(); Map newDefinitionToCallType = new LinkedHashMap<>(); + Map newSeparatorIsStatic = new LinkedHashMap<>(); parser.parse( fullText, newDefinitionPosToReferences, @@ -973,6 +998,7 @@ public class VariableMarker implements SyntaxComponent, CaretListener, PropertyC ((LineMarkedEditorPane) pane).getLinkHandler(), newReferenceToExternalTraitKey, newExternalTraitKeyToReference, newSeparatorPosToType, + newSeparatorIsStatic, newLocalTypeTraitNames, newDefinitionToType, newDefinitionToCallType @@ -995,6 +1021,7 @@ public class VariableMarker implements SyntaxComponent, CaretListener, PropertyC localTypeTraitNames = newLocalTypeTraitNames; definitionToType = newDefinitionToType; definitionToCallType = newDefinitionToCallType; + separatorIsStatic = newSeparatorIsStatic; for (SimpleParseException ex : newErrors) { errors.put((int) ex.position, ex.getMessage()); }