From 82632d9131152bd4ef8cf05765216e7024e9d700 Mon Sep 17 00:00:00 2001 From: bigguy345 Date: Sun, 4 Jan 2026 00:42:00 +0200 Subject: [PATCH] Made Autocomplete respect static/non static contexts --- .../JavaAutocompleteProvider.java | 35 +++++++++++++++++-- .../script/interpreter/ScriptDocument.java | 2 +- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/main/java/noppes/npcs/client/gui/util/script/autocomplete/JavaAutocompleteProvider.java b/src/main/java/noppes/npcs/client/gui/util/script/autocomplete/JavaAutocompleteProvider.java index 802482040..90dd15b53 100644 --- a/src/main/java/noppes/npcs/client/gui/util/script/autocomplete/JavaAutocompleteProvider.java +++ b/src/main/java/noppes/npcs/client/gui/util/script/autocomplete/JavaAutocompleteProvider.java @@ -75,11 +75,14 @@ public class JavaAutocompleteProvider implements AutocompleteProvider { return; } + // Determine if this is a static context (accessing a class type) + boolean isStaticContext = isStaticAccess(receiverExpr, context.prefixStart); + Class clazz = receiverType.getJavaClass(); if (clazz == null) { // Try ScriptTypeInfo if (receiverType instanceof ScriptTypeInfo) { - addScriptTypeMembers((ScriptTypeInfo) receiverType, items); + addScriptTypeMembers((ScriptTypeInfo) receiverType, items, isStaticContext); } return; } @@ -88,6 +91,11 @@ public class JavaAutocompleteProvider implements AutocompleteProvider { Set addedMethods = new HashSet<>(); for (Method method : clazz.getMethods()) { if (Modifier.isPublic(method.getModifiers())) { + // Filter by static context + if (isStaticContext && !Modifier.isStatic(method.getModifiers())) { + continue; + } + String sig = method.getName() + "(" + method.getParameterCount() + ")"; if (!addedMethods.contains(sig)) { addedMethods.add(sig); @@ -100,6 +108,11 @@ public class JavaAutocompleteProvider implements AutocompleteProvider { // Add fields for (Field field : clazz.getFields()) { if (Modifier.isPublic(field.getModifiers())) { + // Filter by static context + if (isStaticContext && !Modifier.isStatic(field.getModifiers())) { + continue; + } + FieldInfo fieldInfo = FieldInfo.fromReflection(field, receiverType); items.add(AutocompleteItem.fromField(fieldInfo)); } @@ -122,16 +135,24 @@ public class JavaAutocompleteProvider implements AutocompleteProvider { /** * Add members from a script-defined type. */ - private void addScriptTypeMembers(ScriptTypeInfo scriptType, List items) { + private void addScriptTypeMembers(ScriptTypeInfo scriptType, List items, boolean isStaticContext) { // Add methods (getMethods returns Map>) for (List overloads : scriptType.getMethods().values()) { for (MethodInfo method : overloads) { + // Filter by static context + if (isStaticContext && !method.isStatic()) { + continue; + } items.add(AutocompleteItem.fromMethod(method)); } } // Add fields (getFields returns Map) for (FieldInfo field : scriptType.getFields().values()) { + // Filter by static context + if (isStaticContext && !field.isStatic()) { + continue; + } items.add(AutocompleteItem.fromField(field)); } @@ -255,6 +276,16 @@ public class JavaAutocompleteProvider implements AutocompleteProvider { return null; } + /** + * Check if the receiver expression represents static access (class type). + * Similar logic to FieldChainMarker.isStaticContext(). + */ + private boolean isStaticAccess(String receiverExpr, int position) { + // Try to resolve the receiver expression as a type + TypeInfo typeCheck = document.resolveType(receiverExpr); + return typeCheck != null && typeCheck.isResolved(); + } + /** * Filter items by prefix and calculate match scores. */ 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 456e08e02..ca037bdc8 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 @@ -1439,7 +1439,7 @@ public class ScriptDocument { return result.isEmpty() ? null : result; } - TypeInfo resolveType(String typeName) { + public TypeInfo resolveType(String typeName) { return resolveTypeAndTrackUsage(typeName); }