|
6 | 6 | import de.peeeq.wurstio.languageserver.WFile; |
7 | 7 | import de.peeeq.wurstscript.WLogger; |
8 | 8 | import de.peeeq.wurstscript.ast.*; |
| 9 | +import de.peeeq.wurstscript.attributes.CofigOverridePackages; |
| 10 | +import de.peeeq.wurstscript.attributes.names.NameLink; |
9 | 11 | import de.peeeq.wurstscript.parser.WPos; |
10 | 12 | import de.peeeq.wurstscript.utils.Utils; |
11 | 13 | import org.eclipse.lsp4j.Location; |
@@ -45,6 +47,13 @@ private List<? extends Location> execute2(ModelManager modelManager) { |
45 | 47 | } |
46 | 48 | Element e = Utils.getAstElementAtPos(cu, line, column, false).get(); |
47 | 49 | WLogger.info("get definition at: " + e.getClass().getSimpleName()); |
| 50 | + NameDef configuredDecl = getConfiguredDeclarationAtPos(e); |
| 51 | + if (configuredDecl != null) { |
| 52 | + NameDef originalDecl = getOriginalConfigDeclaration(configuredDecl); |
| 53 | + if (originalDecl != null) { |
| 54 | + return linkTo(originalDecl); |
| 55 | + } |
| 56 | + } |
48 | 57 | if (e instanceof FuncRef) { |
49 | 58 | FuncRef funcRef = (FuncRef) e; |
50 | 59 | FunctionDefinition decl = funcRef.attrFuncDef(); |
@@ -85,6 +94,40 @@ private List<? extends Location> execute2(ModelManager modelManager) { |
85 | 94 | return Collections.emptyList(); |
86 | 95 | } |
87 | 96 |
|
| 97 | + private NameDef getConfiguredDeclarationAtPos(Element e) { |
| 98 | + if (e instanceof NameDef) { |
| 99 | + return (NameDef) e; |
| 100 | + } |
| 101 | + Element current = e; |
| 102 | + while (current != null) { |
| 103 | + if (current instanceof NameDef) { |
| 104 | + return (NameDef) current; |
| 105 | + } |
| 106 | + current = current.getParent(); |
| 107 | + } |
| 108 | + return null; |
| 109 | + } |
| 110 | + |
| 111 | + private NameDef getOriginalConfigDeclaration(NameDef nameDef) { |
| 112 | + if (!(nameDef instanceof GlobalVarDef) || !nameDef.hasAnnotation("@config")) { |
| 113 | + return null; |
| 114 | + } |
| 115 | + PackageOrGlobal nearestPackage = nameDef.attrNearestPackage(); |
| 116 | + if (!(nearestPackage instanceof WPackage)) { |
| 117 | + return null; |
| 118 | + } |
| 119 | + WPackage configPackage = (WPackage) nearestPackage; |
| 120 | + if (!configPackage.getName().endsWith(CofigOverridePackages.CONFIG_POSTFIX)) { |
| 121 | + return null; |
| 122 | + } |
| 123 | + WPackage originalPackage = CofigOverridePackages.getOriginalPackage(configPackage); |
| 124 | + if (originalPackage == null) { |
| 125 | + return null; |
| 126 | + } |
| 127 | + NameLink originalVar = originalPackage.getElements().lookupVarNoConfig(nameDef.getName(), false); |
| 128 | + return originalVar == null ? null : originalVar.getDef(); |
| 129 | + } |
| 130 | + |
88 | 131 | private List<? extends Location> linkTo(AstElementWithSource decl) { |
89 | 132 | if (decl == null) { |
90 | 133 | return Collections.emptyList(); |
|
0 commit comments