Skip to content

Commit

Permalink
Merge pull request apache#7149 from dbalek/dbalek/lsp-cc-for-static-m…
Browse files Browse the repository at this point in the history
…embers

LSP: Code completion for Java static members.
  • Loading branch information
dbalek authored Mar 13, 2024
2 parents 643b647 + bbc3bee commit 63dc7ee
Showing 1 changed file with 111 additions and 79 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -426,24 +426,22 @@ public Completion createTypeCastableVariableItem(CompilationInfo info, VariableE
TextEdit textEdit = null;
String filter = null;
if (castType != null) {
try {
int castStartOffset = assignToVarOffset;
TreePath tp = info.getTreeUtilities().pathFor(substitutionOffset);
if (castStartOffset < 0) {
if (tp != null && tp.getLeaf().getKind() == Tree.Kind.MEMBER_SELECT) {
castStartOffset = (int)info.getTrees().getSourcePositions().getStartPosition(tp.getCompilationUnit(), tp.getLeaf());
}
int castStartOffset = assignToVarOffset;
TreePath tp = info.getTreeUtilities().pathFor(substitutionOffset);
if (castStartOffset < 0) {
if (tp != null && tp.getLeaf().getKind() == Tree.Kind.MEMBER_SELECT) {
castStartOffset = (int)info.getTrees().getSourcePositions().getStartPosition(tp.getCompilationUnit(), tp.getLeaf());
}
StringBuilder castText = new StringBuilder();
castText.append("((").append(AutoImport.resolveImport(info, tp, castType)).append(CodeStyle.getDefault(info.getDocument()).spaceAfterTypeCast() ? ") " : ")");
int castEndOffset = findCastEndPosition(info.getTokenHierarchy().tokenSequence(JavaTokenId.language()), castStartOffset, substitutionOffset);
if (castEndOffset >= 0) {
castText.append(info.getText().subSequence(castStartOffset, castEndOffset)).append(")");
castText.append(info.getText().subSequence(castEndOffset, substitutionOffset)).append(elem.getSimpleName());
textEdit = new TextEdit(castStartOffset, offset, castText.toString());
filter = info.getText().substring(castStartOffset, substitutionOffset) + elem.getSimpleName().toString();
}
} catch (IOException ex) {}
}
StringBuilder castText = new StringBuilder();
castText.append("((").append(AutoImport.resolveImport(info, tp, castType)).append(CodeStyle.getDefault(doc).spaceAfterTypeCast() ? ") " : ")");
int castEndOffset = findCastEndPosition(info.getTokenHierarchy().tokenSequence(JavaTokenId.language()), castStartOffset, substitutionOffset);
if (castEndOffset >= 0) {
castText.append(info.getText().subSequence(castStartOffset, castEndOffset)).append(")");
castText.append(info.getText().subSequence(castEndOffset, substitutionOffset)).append(elem.getSimpleName());
textEdit = new TextEdit(castStartOffset, offset, castText.toString());
filter = info.getText().substring(castStartOffset, substitutionOffset) + elem.getSimpleName().toString();
}
}
if (textEdit != null && filter != null) {
builder.textEdit(textEdit)
Expand Down Expand Up @@ -522,14 +520,7 @@ public Completion createGetterSetterMethodItem(CompilationInfo info, VariableEle
labelDetail.append('(');
sortParams.append('(');
if (setter) {
CodeStyle cs = null;
try {
cs = CodeStyle.getDefault(info.getDocument());
} catch (IOException ex) {
}
if (cs == null) {
cs = CodeStyle.getDefault(info.getFileObject());
}
CodeStyle cs = CodeStyle.getDefault(doc);
boolean isStatic = elem.getModifiers().contains(Modifier.STATIC);
String simpleName = CodeStyleUtils.removePrefixSuffix(elem.getSimpleName(),
isStatic ? cs.getStaticFieldNamePrefix() : cs.getFieldNamePrefix(),
Expand Down Expand Up @@ -689,32 +680,69 @@ public Completion createStaticMemberItem(CompilationInfo info, DeclaredType type
});
String label = type.asElement().getSimpleName() + "." + memberElem.getSimpleName();
String sortText = memberElem.getSimpleName().toString();
String memberTypeName;
StringBuilder labelDetail = new StringBuilder();
StringBuilder insertText = new StringBuilder(label);
boolean asTemplate = false;
if (memberElem.getKind().isField()) {
memberTypeName = Utilities.getTypeName(info, memberType, false).toString();
sortText += String.format("#%s", Utilities.getTypeName(info, type, false)); //NOI18N
} else {
} else if (memberElem.getKind() == ElementKind.METHOD) {
CodeStyle cs = CodeStyle.getDefault(doc);
memberTypeName = Utilities.getTypeName(info, ((ExecutableType) memberType).getReturnType(), false).toString();
StringBuilder sortParams = new StringBuilder();
labelDetail.append('(');
sortParams.append('(');
insertText.append(cs.spaceBeforeMethodCallParen() ? " (" : "(");
int cnt = 0;
Iterator<? extends TypeMirror> tIt = ((ExecutableType)memberType).getParameterTypes().iterator();
while(tIt.hasNext()) {
Iterator<? extends VariableElement> it = ((ExecutableElement) memberElem).getParameters().iterator();
Iterator<? extends TypeMirror> tIt = ((ExecutableType) memberType).getParameterTypes().iterator();
while (it.hasNext() && tIt.hasNext()) {
TypeMirror tm = tIt.next();
if (tm == null) {
break;
}
sortParams.append(Utilities.getTypeName(info, tm, false, ((ExecutableElement)memberElem).isVarArgs() && !tIt.hasNext()).toString());
String paramTypeName = Utilities.getTypeName(info, tm, false, ((ExecutableElement) memberElem).isVarArgs() && !tIt.hasNext()).toString();
String paramName = it.next().getSimpleName().toString();
labelDetail.append(paramTypeName).append(' ').append(paramName);
sortParams.append(paramTypeName);
VariableElement inst = instanceOf(tm, paramName);
if (cnt == 0 && cs.spaceWithinMethodCallParens()) {
insertText.append(' ');
}
insertText.append("${").append(cnt).append(":").append(inst != null ? inst.getSimpleName() : paramName).append("}");
asTemplate = true;
if (tIt.hasNext()) {
labelDetail.append(", ");
sortParams.append(',');
if (cs.spaceBeforeComma()) {
insertText.append(' ');
}
insertText.append(',');
if (cs.spaceAfterComma()) {
insertText.append(' ');
}
} else if (cs.spaceWithinMethodCallParens()) {
insertText.append(' ');
}
cnt++;
}
labelDetail.append(')');
sortParams.append(')');
insertText.append(')');
sortText += String.format("#%02d#%s#s", cnt, sortParams.toString(), Utilities.getTypeName(info, type, false)); //NOI18N
} else {
return null;
}
CompletionCollector.Builder builder = CompletionCollector.newBuilder(label)
.kind(elementKind2CompletionItemKind(memberElem.getKind()))
.insertText(label)
.insertTextFormat(Completion.TextFormat.PlainText)
.labelDescription(memberTypeName)
.insertText(insertText.toString())
.insertTextFormat(asTemplate ? Completion.TextFormat.Snippet : Completion.TextFormat.PlainText)
.sortText(String.format("%04d%s", memberElem.getKind().isField() ? 720 : 750, sortText));
if (labelDetail.length() > 0) {
builder.labelDetail(labelDetail.toString());
}
if (currentClassImport != null) {
builder.additionalTextEdits(Collections.singletonList(currentClassImport));
}
Expand Down Expand Up @@ -745,16 +773,9 @@ public Completion createInitializeAllConstructorItem(CompilationInfo info, boole
StringBuilder sortParams = new StringBuilder();
labelDetail.append('(');
sortParams.append('(');
CodeStyle cs = null;
try {
cs = CodeStyle.getDefault(info.getDocument());
} catch (IOException ex) {
}
if (cs == null) {
cs = CodeStyle.getDefault(info.getFileObject());
}
int cnt = 0;
if (!isDefault) {
CodeStyle cs = CodeStyle.getDefault(doc);
for (VariableElement ve : fields) {
if (cnt > 0) {
labelDetail.append(", ");
Expand Down Expand Up @@ -826,6 +847,7 @@ public Completion createLambdaItem(CompilationInfo info, TypeElement elem, Decla
StringBuilder label = new StringBuilder();
StringBuilder insertText = new StringBuilder();
StringBuilder sortText = new StringBuilder();
CodeStyle cs = CodeStyle.getDefault(doc);
label.append('(');
insertText.append('(');
sortText.append('(');
Expand All @@ -839,10 +861,8 @@ public Completion createLambdaItem(CompilationInfo info, TypeElement elem, Decla
if (tm == null) {
break;
}
if (cnt > 0) {
label.append(", ");
insertText.append(", ");
sortText.append(',');
if (cnt == 0 && cs.spaceWithinLambdaParens()) {
insertText.append(' ');
}
cnt++;
String paramTypeName = Utilities.getTypeName(info, tm, false, desc.isVarArgs() && !tIt.hasNext()).toString();
Expand All @@ -852,17 +872,22 @@ public Completion createLambdaItem(CompilationInfo info, TypeElement elem, Decla
label.append(paramName);
insertText.append("${").append(cnt).append(":").append(paramName).append("}");
sortText.append(paramTypeName);
if (it.hasNext()) {
label.append(", ");
sortText.append(',');
if (cs.spaceBeforeComma()) {
insertText.append(' ');
}
insertText.append(',');
if (cs.spaceAfterComma()) {
insertText.append(' ');
}
} else if (cs.spaceWithinLambdaParens()) {
insertText.append(' ');
}
}
TypeMirror retType = descType.getReturnType();
label.append(") -> ").append(Utilities.getTypeName(info, retType, false));
CodeStyle cs = null;
try {
cs = CodeStyle.getDefault(info.getDocument());
} catch (IOException ex) {
}
if (cs == null) {
cs = CodeStyle.getDefault(info.getFileObject());
}
insertText.append(cs.spaceAroundLambdaArrow() ? ") ->" : ")->"); //NOI18N
if (cs.getOtherBracePlacement() == CodeStyle.BracePlacement.SAME_LINE) {
insertText.append(cs.spaceAroundLambdaArrow() ? " {\n$0}" : "{\n$0}");
Expand Down Expand Up @@ -1033,8 +1058,9 @@ private Completion createExecutableItem(CompilationInfo info, ExecutableElement
StringBuilder sortParams = new StringBuilder();
insertText.append(simpleName);
labelDetail.append("(");
CodeStyle cs = CodeStyle.getDefault(doc);
if (!inImport && !memberRef) {
insertText.append(CodeStyle.getDefault(doc).spaceBeforeMethodCallParen() ? " (" : "(");
insertText.append(cs.spaceBeforeMethodCallParen() ? " (" : "(");
}
sortParams.append('(');
int cnt = 0;
Expand All @@ -1045,6 +1071,9 @@ private Completion createExecutableItem(CompilationInfo info, ExecutableElement
if (tm == null) {
break;
}
if (!inImport && !memberRef && cnt == 0 && cs.spaceWithinMethodCallParens()) {
insertText.append(' ');
}
cnt++;
String paramTypeName = Utilities.getTypeName(info, tm, false, elem.isVarArgs() && !tIt.hasNext()).toString();
String paramName = it.next().getSimpleName().toString();
Expand All @@ -1059,8 +1088,16 @@ private Completion createExecutableItem(CompilationInfo info, ExecutableElement
labelDetail.append(", ");
sortParams.append(',');
if (!inImport && !memberRef) {
insertText.append(", ");
if (cs.spaceBeforeComma()) {
insertText.append(' ');
}
insertText.append(',');
if (cs.spaceAfterComma()) {
insertText.append(' ');
}
}
} else if (!inImport && !memberRef && cs.spaceWithinMethodCallParens()) {
insertText.append(' ');
}
}
sortParams.append(')');
Expand All @@ -1077,16 +1114,13 @@ private Completion createExecutableItem(CompilationInfo info, ExecutableElement
if (name == null && elem.getKind() == ElementKind.CONSTRUCTOR
&& (elem.getEnclosingElement().getModifiers().contains(Modifier.ABSTRACT)
|| elem.getModifiers().contains(Modifier.PROTECTED) && !info.getTrees().isAccessible(scope, elem, (DeclaredType)elem.getEnclosingElement().asType()))) {
try {
if (CodeStyle.getDefault(info.getDocument()).getClassDeclBracePlacement() == CodeStyle.BracePlacement.SAME_LINE) {
insertText.append(" {\n$0}");
} else {
insertText.append("\n{\n$0}");
}
command = new Command("Complete Abstract Methods", "java.complete.abstract.methods");
asTemplate = true;
} catch (IOException ioe) {
if (cs.getClassDeclBracePlacement() == CodeStyle.BracePlacement.SAME_LINE) {
insertText.append(" {\n$0}");
} else {
insertText.append("\n{\n$0}");
}
command = new Command("Complete Abstract Methods", "java.complete.abstract.methods");
asTemplate = true;
} else if (asTemplate) {
insertText.append("$0");
}
Expand All @@ -1103,24 +1137,22 @@ private Completion createExecutableItem(CompilationInfo info, ExecutableElement
TextEdit textEdit = null;
String filter = null;
if (castType != null) {
try {
TreePath tp = info.getTreeUtilities().pathFor(substitutionOffset);
int castStartOffset = assignToVarOffset;
if (castStartOffset < 0) {
if (tp != null && tp.getLeaf().getKind() == Tree.Kind.MEMBER_SELECT) {
castStartOffset = (int)info.getTrees().getSourcePositions().getStartPosition(tp.getCompilationUnit(), tp.getLeaf());
}
TreePath tp = info.getTreeUtilities().pathFor(substitutionOffset);
int castStartOffset = assignToVarOffset;
if (castStartOffset < 0) {
if (tp != null && tp.getLeaf().getKind() == Tree.Kind.MEMBER_SELECT) {
castStartOffset = (int)info.getTrees().getSourcePositions().getStartPosition(tp.getCompilationUnit(), tp.getLeaf());
}
StringBuilder castText = new StringBuilder();
castText.append("((").append(AutoImport.resolveImport(info, tp, castType)).append(CodeStyle.getDefault(info.getDocument()).spaceAfterTypeCast() ? ") " : ")");
int castEndOffset = findCastEndPosition(info.getTokenHierarchy().tokenSequence(JavaTokenId.language()), castStartOffset, substitutionOffset);
if (castEndOffset >= 0) {
castText.append(info.getText().subSequence(castStartOffset, castEndOffset)).append(")");
castText.append(info.getText().subSequence(castEndOffset, substitutionOffset)).append(insertText);
textEdit = new TextEdit(castStartOffset, offset, castText.toString());
filter = info.getText().substring(castStartOffset, substitutionOffset) + simpleName;
}
} catch (IOException ex) {}
}
StringBuilder castText = new StringBuilder();
castText.append("((").append(AutoImport.resolveImport(info, tp, castType)).append(cs.spaceAfterTypeCast() ? ") " : ")");
int castEndOffset = findCastEndPosition(info.getTokenHierarchy().tokenSequence(JavaTokenId.language()), castStartOffset, substitutionOffset);
if (castEndOffset >= 0) {
castText.append(info.getText().subSequence(castStartOffset, castEndOffset)).append(")");
castText.append(info.getText().subSequence(castEndOffset, substitutionOffset)).append(insertText);
textEdit = new TextEdit(castStartOffset, offset, castText.toString());
filter = info.getText().substring(castStartOffset, substitutionOffset) + simpleName;
}
}
if (textEdit != null && filter != null) {
builder.textEdit(textEdit)
Expand Down

0 comments on commit 63dc7ee

Please sign in to comment.