diff --git a/src/main/java/noppes/npcs/client/gui/util/script/autocomplete/AutocompleteManager.java b/src/main/java/noppes/npcs/client/gui/util/script/autocomplete/AutocompleteManager.java index 360d0633c..47c05c286 100644 --- a/src/main/java/noppes/npcs/client/gui/util/script/autocomplete/AutocompleteManager.java +++ b/src/main/java/noppes/npcs/client/gui/util/script/autocomplete/AutocompleteManager.java @@ -1,12 +1,10 @@ package noppes.npcs.client.gui.util.script.autocomplete; -import noppes.npcs.client.gui.util.script.JavaTextContainer.LineData; import noppes.npcs.client.gui.util.script.interpreter.ScriptDocument; import noppes.npcs.client.gui.util.script.interpreter.ScriptTextContainer; import noppes.npcs.client.gui.util.script.interpreter.type.TypeInfo; import org.lwjgl.input.Mouse; -import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; @@ -391,6 +389,12 @@ public class AutocompleteManager { // Get suggestions from appropriate provider AutocompleteProvider provider = document.isJavaScript() ? jsProvider : javaProvider; + + // For JavaScript, update variable types from analyzer + if (document.isJavaScript() && document.getJSAnalyzer() != null) { + jsProvider.updateVariableTypes(document.getJSAnalyzer().getVariableTypes()); + } + List suggestions = provider.getSuggestions(context); // Limit suggestions to prevent overwhelming the UI and improve performance diff --git a/src/main/java/noppes/npcs/client/gui/util/script/interpreter/ScriptDocument.java b/src/main/java/noppes/npcs/client/gui/util/script/interpreter/ScriptDocument.java index ca037bdc8..af9d60ae1 100644 --- a/src/main/java/noppes/npcs/client/gui/util/script/interpreter/ScriptDocument.java +++ b/src/main/java/noppes/npcs/client/gui/util/script/interpreter/ScriptDocument.java @@ -161,7 +161,7 @@ public class ScriptDocument { * Check if this is a JavaScript/ECMAScript document. */ public boolean isJavaScript() { - return false;//"ECMAScript".equalsIgnoreCase(language); + return "ECMAScript".equalsIgnoreCase(language); } // ==================== TEXT MANAGEMENT ==================== @@ -271,14 +271,24 @@ public class ScriptDocument { // Phase 7: Compute indent guides computeIndentGuides(marks); } + + // Store the last JS analyzer for autocomplete + private JSScriptAnalyzer currentJSAnalyzer; /** * Format JavaScript/ECMAScript code using the JS type inference system. */ private List formatJavaScript() { // Use JSScriptAnalyzer for JS-specific analysis - JSScriptAnalyzer analyzer = new JSScriptAnalyzer(text); - return analyzer.analyze(); + currentJSAnalyzer = new JSScriptAnalyzer(this); + return currentJSAnalyzer.analyze(); + } + + /** + * Get the last JS analyzer (for autocomplete to access variable types). + */ + public JSScriptAnalyzer getJSAnalyzer() { + return currentJSAnalyzer; } /** diff --git a/src/main/java/noppes/npcs/client/gui/util/script/interpreter/js_parser/JSScriptAnalyzer.java b/src/main/java/noppes/npcs/client/gui/util/script/interpreter/js_parser/JSScriptAnalyzer.java index 6da33a795..103ee677c 100644 --- a/src/main/java/noppes/npcs/client/gui/util/script/interpreter/js_parser/JSScriptAnalyzer.java +++ b/src/main/java/noppes/npcs/client/gui/util/script/interpreter/js_parser/JSScriptAnalyzer.java @@ -1,7 +1,9 @@ package noppes.npcs.client.gui.util.script.interpreter.js_parser; +import noppes.npcs.client.gui.util.script.interpreter.ScriptDocument; import noppes.npcs.client.gui.util.script.interpreter.ScriptLine; import noppes.npcs.client.gui.util.script.interpreter.token.TokenType; +import scala.annotation.meta.field; import java.util.*; import java.util.regex.*; @@ -12,6 +14,7 @@ import java.util.regex.*; */ public class JSScriptAnalyzer { + private final ScriptDocument document; private final String text; private final JSTypeRegistry registry; @@ -41,8 +44,9 @@ public class JSScriptAnalyzer { private static final Pattern NUMBER_PATTERN = Pattern.compile("\\b\\d+\\.?\\d*\\b"); - public JSScriptAnalyzer(String text) { - this.text = text; + public JSScriptAnalyzer(ScriptDocument document) { + this.document = document; + this.text = document.getText(); this.registry = JSTypeRegistry.getInstance(); // Ensure registry is initialized if (!registry.isInitialized()) { @@ -385,4 +389,11 @@ public class JSScriptAnalyzer { public String getVariableType(String varName) { return variableTypes.get(varName); } + + /** + * Get all inferred variable types. + */ + public Map getVariableTypes() { + return new HashMap<>(variableTypes); + } } diff --git a/src/main/java/noppes/npcs/client/gui/util/script/interpreter/js_parser/JSTypeRegistry.java b/src/main/java/noppes/npcs/client/gui/util/script/interpreter/js_parser/JSTypeRegistry.java index bc6b71688..e9bdf053f 100644 --- a/src/main/java/noppes/npcs/client/gui/util/script/interpreter/js_parser/JSTypeRegistry.java +++ b/src/main/java/noppes/npcs/client/gui/util/script/interpreter/js_parser/JSTypeRegistry.java @@ -254,12 +254,15 @@ public class JSTypeRegistry { // Detect circular alias references if (visited.contains(baseName)) { - System.err.println("[JSTypeRegistry] Circular type alias detected: " + baseName); + // Circular alias detected - try direct type lookup as fallback + if (types.containsKey(baseName)) { + return types.get(baseName); + } return null; } visited.add(baseName); - // Direct lookup + // Direct lookup in types first (higher priority than aliases) if (types.containsKey(baseName)) { return types.get(baseName); } @@ -267,6 +270,10 @@ public class JSTypeRegistry { // Check type aliases if (typeAliases.containsKey(baseName)) { String resolved = typeAliases.get(baseName); + // Don't follow alias if it resolves to itself + if (resolved.equals(baseName)) { + return null; + } return getType(resolved, visited); }