Skip to content

Commit 6138121

Browse files
committed
feat: hide compiler-generated synthetic fields from autocomplete
Filter out class$0, class$1, etc. fields that Java compilers generate for .class literal expressions when targeting pre-Java 5 bytecode. These are internal compiler implementation details that should not appear in completion results. Added configurable hideSyntheticFields property (default: true) on JavaLanguageSupport with getter/setter API, wired through to SourceCompletionProvider.isAccessible().
1 parent 207eea7 commit 6138121

3 files changed

Lines changed: 86 additions & 0 deletions

File tree

RSTALanguageSupport/src/main/java/org/fife/rsta/ac/java/JavaCompletionProvider.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,16 @@ public List<Completion> getCompletionsAt(JTextComponent tc, Point p) {
123123
}
124124

125125

126+
/**
127+
* Returns the source completion provider used internally.
128+
*
129+
* @return The source completion provider.
130+
*/
131+
SourceCompletionProvider getSourceProvider() {
132+
return sourceProvider;
133+
}
134+
135+
126136
/**
127137
* Returns the jars on the "build path".
128138
*

RSTALanguageSupport/src/main/java/org/fife/rsta/ac/java/JavaLanguageSupport.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,11 @@ public class JavaLanguageSupport extends AbstractLanguageSupport {
6262
*/
6363
private JarManager jarManager;
6464

65+
/**
66+
* Whether to hide compiler-generated synthetic fields from completions.
67+
*/
68+
private boolean hideSyntheticFields = true;
69+
6570
/**
6671
* Client property installed on text areas that points to a listener.
6772
*/
@@ -109,6 +114,33 @@ public JarManager getJarManager() {
109114
}
110115

111116

117+
/**
118+
* Returns whether compiler-generated synthetic fields (e.g.
119+
* {@code class$0}) are hidden from completion results. The default
120+
* value is {@code true}.
121+
*
122+
* @return Whether synthetic fields are hidden.
123+
* @see #setHideSyntheticFields(boolean)
124+
*/
125+
public boolean getHideSyntheticFields() {
126+
return hideSyntheticFields;
127+
}
128+
129+
130+
/**
131+
* Sets whether compiler-generated synthetic fields (e.g. {@code class$0},
132+
* {@code class$1}) should be hidden from completion results. These
133+
* fields are generated by compilers for {@code .class} literal
134+
* expressions when targeting pre-Java 5 bytecode.
135+
*
136+
* @param hide Whether to hide synthetic fields.
137+
* @see #getHideSyntheticFields()
138+
*/
139+
public void setHideSyntheticFields(boolean hide) {
140+
this.hideSyntheticFields = hide;
141+
}
142+
143+
112144
/**
113145
* Returns the Java parser running on a text area with this Java language
114146
* support installed.
@@ -134,6 +166,7 @@ public JavaParser getParser(RSyntaxTextArea textArea) {
134166
public void install(RSyntaxTextArea textArea) {
135167

136168
JavaCompletionProvider p = new JavaCompletionProvider(jarManager);
169+
p.getSourceProvider().setHideSyntheticFields(hideSyntheticFields);
137170
// Can't use createAutoCompletion(), as Java's is "special."
138171
AutoCompletion ac = new JavaAutoCompletion(p, textArea);
139172
ac.setListCellRenderer(new JavaCellRenderer());

RSTALanguageSupport/src/main/java/org/fife/rsta/ac/java/SourceCompletionProvider.java

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,15 @@ class SourceCompletionProvider extends DefaultCompletionProvider {
8989

9090
//Shorthand completions (templates and comments)
9191
private ShorthandCompletionCache shorthandCache;
92+
93+
/**
94+
* Whether to hide compiler-generated synthetic members (e.g.
95+
* {@code class$0} fields, {@code access$0} methods) from completion
96+
* results. These are generated by compilers for {@code .class} literal
97+
* expressions and inner class private member access. Defaults to
98+
* {@code true}.
99+
*/
100+
private boolean hideSyntheticFields = true;
92101
/**
93102
* Constructor.
94103
*/
@@ -113,6 +122,30 @@ class SourceCompletionProvider extends DefaultCompletionProvider {
113122
}
114123

115124

125+
/**
126+
* Returns whether compiler-generated synthetic fields are hidden from
127+
* completion results.
128+
*
129+
* @return Whether synthetic fields are hidden.
130+
* @see #setHideSyntheticFields(boolean)
131+
*/
132+
boolean isHideSyntheticFields() {
133+
return hideSyntheticFields;
134+
}
135+
136+
137+
/**
138+
* Sets whether compiler-generated synthetic fields (e.g. {@code class$0})
139+
* should be hidden from completion results.
140+
*
141+
* @param hide Whether to hide synthetic fields.
142+
* @see #isHideSyntheticFields()
143+
*/
144+
void setHideSyntheticFields(boolean hide) {
145+
this.hideSyntheticFields = hide;
146+
}
147+
148+
116149
private void addCompletionsForStaticMembers(Set<Completion> set,
117150
CompilationUnit cu, ClassFile cf, String pkg) {
118151

@@ -614,6 +647,16 @@ public SourceLocation getSourceLocForClass(String className) {
614647
*/
615648
private boolean isAccessible(MemberInfo info, String pkg) {
616649

650+
// Filter compiler-generated synthetic members from completion results:
651+
// - class$N fields: generated for .class literal expressions (pre-Java 5)
652+
// - access$N methods: generated for inner class private member access
653+
if (hideSyntheticFields) {
654+
String name = info.getName();
655+
if (name != null && (name.startsWith("class$") || name.startsWith("access$"))) {
656+
return false;
657+
}
658+
}
659+
617660
boolean accessible = false;
618661
int access = info.getAccessFlags();
619662

0 commit comments

Comments
 (0)