Skip to content

Commit

Permalink
Merge pull request #2283 from Akshay-Gupta-Oracle/sealedAutocompletion
Browse files Browse the repository at this point in the history
[NETBEANS-3990]: Auto completion for Sealed Types
  • Loading branch information
Akshay-Gupta-19 committed Oct 10, 2020
2 parents 7990cee + 0c53bab commit 429c454
Show file tree
Hide file tree
Showing 27 changed files with 2,836 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
import org.netbeans.api.java.source.support.ErrorAwareTreePathScanner;
import org.netbeans.api.java.source.support.ReferencesCount;
import org.netbeans.api.lexer.TokenSequence;
import org.netbeans.modules.java.completion.TreeShims;
import org.netbeans.api.lexer.TokenUtilities;
import org.netbeans.modules.parsing.api.Source;
import org.openide.util.Pair;

Expand Down Expand Up @@ -168,16 +168,19 @@ public static enum Options {
private static final String MODULE_KEYWORD = "module"; //NOI18N
private static final String NATIVE_KEYWORD = "native"; //NOI18N
private static final String NEW_KEYWORD = "new"; //NOI18N
private static final String NON_SEALED_KEYWORD = "non-sealed"; //NOI18N
private static final String NULL_KEYWORD = "null"; //NOI18N
private static final String OPEN_KEYWORD = "open"; //NOI18N
private static final String OPENS_KEYWORD = "opens"; //NOI18N
private static final String PACKAGE_KEYWORD = "package"; //NOI18N
private static final String PERMITS_KEYWORD = "permits"; //NOI18N
private static final String PRIVATE_KEYWORD = "private"; //NOI18N
private static final String PROTECTED_KEYWORD = "protected"; //NOI18N
private static final String PROVIDES_KEYWORD = "provides"; //NOI18N
private static final String PUBLIC_KEYWORD = "public"; //NOI18N
private static final String RETURN_KEYWORD = "return"; //NOI18N
private static final String REQUIRES_KEYWORD = "requires"; //NOI18N
private static final String SEALED_KEYWORD = "sealed"; //NOI18N
private static final String SHORT_KEYWORD = "short"; //NOI18N
private static final String STATIC_KEYWORD = "static"; //NOI18N
private static final String STRICT_KEYWORD = "strictfp"; //NOI18N
Expand Down Expand Up @@ -238,8 +241,10 @@ public static enum Options {
private static final SourceVersion SOURCE_VERSION_RELEASE_11;
private static final SourceVersion SOURCE_VERSION_RELEASE_13;
private static final SourceVersion SOURCE_VERSION_RELEASE_14;
private static final SourceVersion SOURCE_VERSION_RELEASE_15;

static {
SourceVersion r10, r11, r13, r14;
SourceVersion r10, r11, r13, r14, r15;

try {
r10 = SourceVersion.valueOf("RELEASE_10");
Expand All @@ -261,12 +266,19 @@ public static enum Options {
} catch (IllegalArgumentException ex) {
r14 = null;
}

try {
r15 = SourceVersion.valueOf("RELEASE_15");
} catch (IllegalArgumentException ex) {
r15 = null;
}

SOURCE_VERSION_RELEASE_10 = r10;
SOURCE_VERSION_RELEASE_11 = r11;
SOURCE_VERSION_RELEASE_13 = r13;
SOURCE_VERSION_RELEASE_14 = r14;
}
SOURCE_VERSION_RELEASE_15 = r15;
}

private final ItemFactory<T> itemFactory;
private final Set<Options> options;
Expand Down Expand Up @@ -765,6 +777,26 @@ private void insideClass(Env env) throws IOException {
return;
}
TreeUtilities tu = controller.getTreeUtilities();
Tree lastPerm = null;
List<? extends Tree> permits = TreeShims.getPermits(cls);
permits = permits == null ? new ArrayList<>() : permits;
for (Tree perm : permits) {
int permPos = (int) sourcePositions.getEndPosition(root, perm);
if (permPos == Diagnostic.NOPOS || offset <= permPos) {
break;
}
lastPerm = perm;
startPos = permPos;
}
if (lastPerm != null) {
TokenSequence<JavaTokenId> last = findLastNonWhitespaceToken(env, startPos, offset);
if (last != null && last.token().id() == JavaTokenId.COMMA) {
controller.toPhase(Phase.ELEMENTS_RESOLVED);
env.addToExcludes(controller.getTrees().getElement(path));
addClassTypes(env, null);
}
return;
}
Tree lastImpl = null;
for (Tree impl : cls.getImplementsClause()) {
int implPos = (int) sourcePositions.getEndPosition(root, impl);
Expand All @@ -780,6 +812,12 @@ private void insideClass(Env env) throws IOException {
controller.toPhase(Phase.ELEMENTS_RESOLVED);
env.addToExcludes(controller.getTrees().getElement(path));
addTypes(env, EnumSet.of(INTERFACE, ANNOTATION_TYPE), null);
} else if (isSealedSupported(env) && last != null && TokenUtilities.textEquals(last.token().text(),PERMITS_KEYWORD)) {
controller.toPhase(Phase.ELEMENTS_RESOLVED);
env.addToExcludes(controller.getTrees().getElement(path));
addClassTypes(env, null);
} else if (isSealedSupported(env)) {
addKeyword(env, PERMITS_KEYWORD, SPACE, false);
}
return;
}
Expand All @@ -792,8 +830,15 @@ private void insideClass(Env env) throws IOException {
controller.toPhase(Phase.ELEMENTS_RESOLVED);
env.addToExcludes(controller.getTrees().getElement(path));
addTypes(env, EnumSet.of(INTERFACE, ANNOTATION_TYPE), null);
} else if (isSealedSupported(env) && last != null && TokenUtilities.textEquals(last.token().text(),PERMITS_KEYWORD)) {
controller.toPhase(Phase.ELEMENTS_RESOLVED);
env.addToExcludes(controller.getTrees().getElement(path));
addClassTypes(env, null);
} else {
addKeyword(env, IMPLEMENTS_KEYWORD, SPACE, false);
if (isSealedSupported(env)) {
addKeyword(env, PERMITS_KEYWORD, SPACE, false);
}
}
return;
}
Expand Down Expand Up @@ -831,6 +876,9 @@ private void insideClass(Env env) throws IOException {
if (!tu.isAnnotation(cls)) {
if (!tu.isEnum(cls)) {
addKeyword(env, EXTENDS_KEYWORD, SPACE, false);
if (isSealedSupported(env)) {
addKeyword(env, PERMITS_KEYWORD, SPACE, false);
}
}
if (!tu.isInterface(cls)) {
addKeyword(env, IMPLEMENTS_KEYWORD, SPACE, false);
Expand Down Expand Up @@ -858,9 +906,18 @@ private void insideClass(Env env) throws IOException {
addTypes(env, EnumSet.of(INTERFACE, ANNOTATION_TYPE), null);
break;
case IDENTIFIER:
if (isSealedSupported(env) && TokenUtilities.textEquals(lastNonWhitespaceToken.token().text(),PERMITS_KEYWORD)) {
controller.toPhase(Phase.ELEMENTS_RESOLVED);
env.addToExcludes(controller.getTrees().getElement(path));
addClassTypes(env, null);
break;
}
if (!tu.isAnnotation(cls)) {
if (!tu.isEnum(cls)) {
addKeyword(env, EXTENDS_KEYWORD, SPACE, false);
if (isSealedSupported(env)) {
addKeyword(env, PERMITS_KEYWORD, SPACE, false);
}
}
if (!tu.isInterface(cls)) {
addKeyword(env, IMPLEMENTS_KEYWORD, SPACE, false);
Expand Down Expand Up @@ -3038,6 +3095,9 @@ private void addClassTypes(final Env env, DeclaredType baseType) throws IOExcept
private boolean isRecordSupported(final Env env) {
return (SOURCE_VERSION_RELEASE_14 != null && env.getController().getSourceVersion().compareTo(SOURCE_VERSION_RELEASE_14) >= 0);
}
private boolean isSealedSupported(final Env env) {
return (SOURCE_VERSION_RELEASE_15 != null && env.getController().getSourceVersion().compareTo(SOURCE_VERSION_RELEASE_15) >= 0);
}

private void insideRecord(Env env) throws IOException {
int offset = env.getOffset();
Expand Down Expand Up @@ -4513,6 +4573,10 @@ private void addKeywordsForCU(Env env) {
if (isRecordSupported(env)) {
kws.add(RECORD_KEYWORD);
}
if (isSealedSupported(env)) {
kws.add(SEALED_KEYWORD);
kws.add(NON_SEALED_KEYWORD);
}
}
boolean beforeAnyClass = true;
boolean beforePublicClass = true;
Expand Down Expand Up @@ -4576,6 +4640,14 @@ private void addKeywordsForClassBody(Env env) {
results.add(itemFactory.createKeywordItem(kw, SPACE, anchorOffset, false));
}
}
if (isSealedSupported(env)) {
if (Utilities.startsWith(SEALED_KEYWORD, prefix)) {
results.add(itemFactory.createKeywordItem(SEALED_KEYWORD, SPACE, anchorOffset, false));
}
if (Utilities.startsWith(NON_SEALED_KEYWORD, prefix)) {
results.add(itemFactory.createKeywordItem(NON_SEALED_KEYWORD, SPACE, anchorOffset, false));
}
}
if (env.getController().getSourceVersion().compareTo(SourceVersion.RELEASE_8) >= 0
&& Utilities.startsWith(DEFAULT_KEYWORD, prefix)
&& env.getController().getTreeUtilities().getPathElementOfKind(Tree.Kind.INTERFACE, env.getPath()) != null) {
Expand Down Expand Up @@ -4779,9 +4851,13 @@ private void addClassModifiers(Env env, Set<Modifier> modifiers) {
if (!modifiers.contains(PUBLIC) && !modifiers.contains(PRIVATE)) {
kws.add(PUBLIC_KEYWORD);
}
if (!modifiers.contains(FINAL) && !modifiers.contains(ABSTRACT)) {
if (!modifiers.contains(FINAL) && !modifiers.contains(ABSTRACT) && !modifiers.contains(SEALED_KEYWORD) && !modifiers.contains(NON_SEALED_KEYWORD)) {
kws.add(ABSTRACT_KEYWORD);
kws.add(FINAL_KEYWORD);
if (isSealedSupported(env)) {
kws.add(SEALED_KEYWORD);
kws.add(NON_SEALED_KEYWORD);
}
}
kws.add(CLASS_KEYWORD);
kws.add(INTERFACE_KEYWORD);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
public Test() - generate
protected native Object clone() - override
public boolean equals(Object arg0) - override
protected void finalize() - override
public List<String> getList() - generate
public double getSomething() - generate
public String getText() - generate
public int getTime() - generate
public native int hashCode() - override
public void setList(List<String> list) - generate
public void setSomething(double something) - generate
public void setText(String text) - generate
public void setTime(int time) - generate
public String toString() - override
abstract
boolean
byte
char
class
double
enum
final
float
int
interface
long
native
non-sealed
private
protected
public
record
sealed
short
static
strictfp
synchronized
transient
void
volatile
AbstractMethodError
Appendable
ArithmeticException
ArrayIndexOutOfBoundsException
ArrayStoreException
AssertionError
AutoCloseable
Boolean
BootstrapMethodError
Byte
CharSequence
Character
Class
ClassCastException
ClassCircularityError
ClassFormatError
ClassLoader
ClassNotFoundException
ClassValue
CloneNotSupportedException
Cloneable
Comparable
Compiler
Deprecated
Double
Enum
EnumConstantNotPresentException
Error
Exception
ExceptionInInitializerError
Float
FunctionalInterface
HashMap
IllegalAccessError
IllegalAccessException
IllegalArgumentException
IllegalCallerException
IllegalMonitorStateException
IllegalStateException
IllegalThreadStateException
IncompatibleClassChangeError
IndexOutOfBoundsException
InheritableThreadLocal
InstantiationError
InstantiationException
Integer
InternalError
InterruptedException
Iterable
LayerInstantiationException
LinkageError
List
Long
Map
Math
Module
ModuleLayer
NegativeArraySizeException
NoClassDefFoundError
NoSuchFieldError
NoSuchFieldException
NoSuchMethodError
NoSuchMethodException
NullPointerException
Number
NumberFormatException
Object
OutOfMemoryError
Override
Package
Process
ProcessBuilder
ProcessHandle
Readable
Record
ReflectiveOperationException
Runnable
Runtime
RuntimeException
RuntimePermission
SafeVarargs
SecurityException
SecurityManager
Set
Short
StackOverflowError
StackTraceElement
StackWalker
StrictMath
String
StringBuffer
StringBuilder
StringIndexOutOfBoundsException
SuppressWarnings
System
Test
Thread
ThreadDeath
ThreadGroup
ThreadLocal
Throwable
TypeNotPresentException
UnknownError
UnsatisfiedLinkError
UnsupportedClassVersionError
UnsupportedOperationException
VerifyError
VirtualMachineError
Void
X
com
java
javax
org
sun
Loading

0 comments on commit 429c454

Please sign in to comment.