diff --git a/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/codeaction/CodeActionUtil.java b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/codeaction/CodeActionUtil.java index f3dbe791b018..3e03cb4a72ef 100644 --- a/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/codeaction/CodeActionUtil.java +++ b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/codeaction/CodeActionUtil.java @@ -86,6 +86,7 @@ import java.util.Optional; import java.util.function.Function; import java.util.function.Predicate; +import java.util.stream.Collectors; import static org.ballerinalang.langserver.common.utils.CommonUtil.LINE_SEPARATOR; @@ -382,44 +383,45 @@ public static List getTypeGuardCodeActionEdits(String varName, Range r String spaces = StringUtils.repeat(' ', range.getStart().getCharacter()); String padding = LINE_SEPARATOR + LINE_SEPARATOR + spaces; - boolean hasError = CodeActionUtil.hasErrorMemberType(unionType); + List errorMembers = unionType.memberTypeDescriptors().stream() + .filter(typeSymbol -> CommonUtil.getRawType(typeSymbol).typeKind() == TypeDescKind.ERROR) + .collect(Collectors.toList()); List members = new ArrayList<>(unionType.memberTypeDescriptors()); - long errorTypesCount = unionType.memberTypeDescriptors().stream() - .map(CommonUtil::getRawType) - .filter(t -> t.typeKind() == TypeDescKind.ERROR) - .count(); + if (members.size() == 1) { // Skip type guard return edits; } - boolean transitiveBinaryUnion = unionType.memberTypeDescriptors().size() - errorTypesCount == 1; + boolean transitiveBinaryUnion = unionType.memberTypeDescriptors().size() - errorMembers.size() == 1; if (transitiveBinaryUnion) { - members.removeIf(s -> s.typeKind() == TypeDescKind.ERROR); + members.removeIf(typeSymbol -> CommonUtil.getRawType(typeSymbol).typeKind() == TypeDescKind.ERROR); } - // Check is binary union type with error type - if ((unionType.memberTypeDescriptors().size() == 2 || transitiveBinaryUnion) && hasError) { + + ImportsAcceptor importsAcceptor = new ImportsAcceptor(context); + // Check if a union type with error and one non-error type + if ((unionType.memberTypeDescriptors().size() == 2 || transitiveBinaryUnion) && !errorMembers.isEmpty()) { members.forEach(bType -> { if (bType.typeKind() == TypeDescKind.NIL) { // if (foo() is error) {...} - String newText = generateIfElseText(varName, spaces, padding, Collections.singletonList("error")); + String type = errorMembers.get(0).signature(); + type = FunctionGenerator.processModuleIDsInText(importsAcceptor, type, context); + String newText = generateIfElseText(varName, spaces, padding, List.of(type)); edits.add(new TextEdit(newTextRange, newText)); } else { // if (foo() is int) {...} else {...} String type = CodeActionUtil.getPossibleType(bType, edits, context).orElseThrow(); - String newText = generateIfElseText(varName, spaces, padding, Collections.singletonList(type)); + String newText = generateIfElseText(varName, spaces, padding, List.of(type)); edits.add(new TextEdit(newTextRange, newText)); } }); } else { - boolean addErrorTypeAtEnd; + boolean addErrorTypeAtEnd = false; List tMembers = new ArrayList<>((unionType).memberTypeDescriptors()); - if (errorTypesCount > 1) { + if (errorMembers.size() > 1) { // merge all error types into generic `error` type - tMembers.removeIf(s -> s.typeKind() == TypeDescKind.ERROR); + tMembers.removeIf(typeSymbol -> CommonUtil.getRawType(typeSymbol).typeKind() == TypeDescKind.ERROR); addErrorTypeAtEnd = true; - } else { - addErrorTypeAtEnd = false; } List memberTypes = new ArrayList<>(); for (TypeSymbol tMember : tMembers) { @@ -430,6 +432,8 @@ public static List getTypeGuardCodeActionEdits(String varName, Range r } edits.add(new TextEdit(newTextRange, generateIfElseText(varName, spaces, padding, memberTypes))); } + + edits.addAll(importsAcceptor.getNewImportTextEdits()); return edits; } @@ -511,9 +515,17 @@ public static List getAddCheckTextEdits(Position pos, NonTerminalNode } } + // If we are in a method call expression and the expression part already doesn't have a brace, we have to add + // braces to prevent the "check" being added to the entire method call expression. + if (matchedNode.kind() != SyntaxKind.BRACED_EXPRESSION && + matchedNode.parent().kind() == SyntaxKind.METHOD_CALL) { + Position endPos = PositionUtil.toPosition(matchedNode.lineRange().endLine()); + edits.add(new TextEdit(new Range(pos, pos), "(")); + edits.add(new TextEdit(new Range(endPos, endPos), ")")); + } + // Add `check` expression text edit - Position insertPos = new Position(pos.getLine(), pos.getCharacter()); - edits.add(new TextEdit(new Range(insertPos, insertPos), "check ")); + edits.add(new TextEdit(new Range(pos, pos), "check ")); // Add parent function return change text edits if (!returnText.isEmpty()) { diff --git a/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/codeaction/providers/AddCheckCodeAction.java b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/codeaction/providers/AddCheckCodeAction.java index 11d8c0adbc05..2fb87e978258 100644 --- a/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/codeaction/providers/AddCheckCodeAction.java +++ b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/codeaction/providers/AddCheckCodeAction.java @@ -53,7 +53,11 @@ public class AddCheckCodeAction extends TypeCastCodeAction { public static final String NAME = "Add Check"; - public static final Set DIAGNOSTIC_CODES = Set.of("BCE2652", "BCE2066", "BCE2068", "BCE2800", "BCE3998"); + private static final String DIAGNOSTIC_CODE_3998 = "BCE3998"; + private static final String DIAGNOSTIC_CODE_2068 = "BCE2068"; + private static final String DIAGNOSTIC_CODE_2800 = "BCE2800"; + public static final Set DIAGNOSTIC_CODES = Set.of("BCE2652", "BCE2066", + DIAGNOSTIC_CODE_2068, DIAGNOSTIC_CODE_2800, DIAGNOSTIC_CODE_3998); public AddCheckCodeAction() { super(); @@ -78,14 +82,14 @@ public List getCodeActions(Diagnostic diagnostic, DiagBasedPositionD } Optional foundType; - if ("BCE2068".equals(diagnostic.diagnosticInfo().code())) { + if (DIAGNOSTIC_CODE_2068.equals(diagnostic.diagnosticInfo().code())) { foundType = positionDetails.diagnosticProperty( CodeActionUtil.getDiagPropertyFilterFunction( DiagBasedPositionDetails.DIAG_PROP_INCOMPATIBLE_TYPES_FOUND_SYMBOL_INDEX)); - } else if ("BCE2800".equals(diagnostic.diagnosticInfo().code())) { + } else if (DIAGNOSTIC_CODE_2800.equals(diagnostic.diagnosticInfo().code())) { foundType = positionDetails.diagnosticProperty( DiagBasedPositionDetails.DIAG_PROP_INCOMPATIBLE_TYPES_FOR_ITERABLE_FOUND_SYMBOL_INDEX); - } else if ("BCE3998".equals(diagnostic.diagnosticInfo().code())) { + } else if (DIAGNOSTIC_CODE_3998.equals(diagnostic.diagnosticInfo().code())) { foundType = context.currentSemanticModel() .flatMap(semanticModel -> semanticModel.typeOf(expressionNode.get())); @@ -109,7 +113,7 @@ public List getCodeActions(Diagnostic diagnostic, DiagBasedPositionD if (expressionNode.get().kind() == SyntaxKind.BRACED_EXPRESSION) { BracedExpressionNode bracedExpressionNode = (BracedExpressionNode) expressionNode.get(); pos = PositionUtil.toRange(bracedExpressionNode.expression().location().lineRange()).getStart(); - } else if ("BCE3998".equals(diagnostic.diagnosticInfo().code())) { + } else if (DIAGNOSTIC_CODE_3998.equals(diagnostic.diagnosticInfo().code())) { // In the case of "BCE3998", we have to consider the position as the position of the initializer // because the diagnostic range is provided for the variable declaration statement instead of the // initializer expression diff --git a/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/common/utils/CommonUtil.java b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/common/utils/CommonUtil.java index 9c1100b47ead..186f3ed6b325 100644 --- a/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/common/utils/CommonUtil.java +++ b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/common/utils/CommonUtil.java @@ -437,9 +437,14 @@ public static List getQualifiersOfNode(BallerinaCompletionContext context List qualsAtCursor = getQualifiersAtCursor(context); Set foundQuals = qualifiers.stream().map(Node::kind).collect(Collectors.toSet()); context.getNodeAtCursor().leadingInvalidTokens().stream() - .filter(token -> QUALIFIER_KINDS.contains(token.kind()) - && !foundQuals.contains(token.kind())).forEach(qualifiers::add); - qualifiers.addAll(qualsAtCursor); + .filter(token -> QUALIFIER_KINDS.contains(token.kind())) + .filter(token -> !foundQuals.contains(token.kind())) + .forEach(qualifiers::add); + // Avoid duplicating the token at cursor. + qualsAtCursor.stream() + .filter(token -> qualifiers.stream() + .noneMatch(qual -> qual.textRange().equals(token.textRange()))) + .forEach(qualifiers::add); return qualifiers; default: } diff --git a/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/providers/context/ModulePartNodeContext.java b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/providers/context/ModulePartNodeContext.java index de3fa7f29b0f..7c3281ae868c 100644 --- a/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/providers/context/ModulePartNodeContext.java +++ b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/providers/context/ModulePartNodeContext.java @@ -34,6 +34,7 @@ import org.ballerinalang.langserver.completions.util.QNameRefCompletionUtil; import org.ballerinalang.langserver.completions.util.Snippet; import org.ballerinalang.langserver.completions.util.SortingUtil; +import org.eclipse.lsp4j.Position; import java.util.ArrayList; import java.util.Arrays; @@ -87,7 +88,7 @@ public List getCompletions(BallerinaCompletionContext context, currently the qualifier can be isolated/transactional/client. */ completionItems.addAll(this.getCompletionItemsOnQualifiers(node, context)); - Optional lastQualifier = CommonUtil.getLastQualifier(context, node); + Optional lastQualifier = getLastQualifier(context, node); if (lastQualifier.isPresent() && lastQualifier.get().kind() == SyntaxKind.CONFIGURABLE_KEYWORD) { resolvedContext = ResolvedContext.CONFIGURABLE_QUALIFIER; } @@ -160,6 +161,52 @@ protected List getCompletionItemsOnQualifiers(Node node, Balle return completionItems; } + /** + * Check if the cursor is after the qualifiers of the node. + * + * @param context completion context + * @param node node. + * @return True if the cursor is after the qualifiers of the node. + */ + @Override + protected boolean onSuggestionsAfterQualifiers(BallerinaCompletionContext context, Node node) { + int cursor = context.getCursorPositionInTree(); + Position cursorPos = context.getCursorPosition(); + // Get the qualifiers in the same line as the cursor + List qualifiers = CommonUtil.getQualifiersOfNode(context, node) + .stream() + .filter(qualifier -> qualifier.lineRange().endLine().line() == cursorPos.getLine()) + .collect(Collectors.toList()); + if (qualifiers.isEmpty()) { + return false; + } + + // If cursor is after the last qualifier, no problem + Token lastQualifier = qualifiers.get(qualifiers.size() - 1); + return lastQualifier.textRange().endOffset() < cursor; + } + + /** + * Get the last qualifier of the node, but in the same line as the cursor. We have to consider the cursor's + * line here due to parser's behavior at the module context. + * + * @param context Completion context + * @param node Node + * @return Optional last qualifier's token + */ + private Optional getLastQualifier(BallerinaCompletionContext context, Node node) { + Position cursorPos = context.getCursorPosition(); + // Get the qualifiers in the same line as the cursor + List qualifiers = CommonUtil.getQualifiersOfNode(context, node) + .stream() + .filter(qualifier -> qualifier.lineRange().endLine().line() == cursorPos.getLine()) + .collect(Collectors.toList()); + if (qualifiers.isEmpty()) { + return Optional.empty(); + } + return Optional.of(qualifiers.get(qualifiers.size() - 1)); + } + private List getModulePartContextItems(BallerinaCompletionContext context) { NonTerminalNode nodeAtCursor = context.getNodeAtCursor(); List completionItems = new ArrayList<>(); diff --git a/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/providers/context/QueryPipelineNodeContext.java b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/providers/context/QueryPipelineNodeContext.java index 3b3a23a5ccb8..2036aeed08f2 100644 --- a/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/providers/context/QueryPipelineNodeContext.java +++ b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/providers/context/QueryPipelineNodeContext.java @@ -138,7 +138,7 @@ private boolean onSuggestDirectionKeywords(BallerinaCompletionContext context, Q closestNode = next; } } - if (closestNode.kind() != SyntaxKind.ORDER_BY_CLAUSE) { + if (closestNode == null || closestNode.kind() != SyntaxKind.ORDER_BY_CLAUSE) { return false; } SeparatedNodeList orderKeyNodes = ((OrderByClauseNode) closestNode).orderKey(); diff --git a/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/util/SortingUtil.java b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/util/SortingUtil.java index c7f6883cd973..7d1455b1262e 100644 --- a/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/util/SortingUtil.java +++ b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/util/SortingUtil.java @@ -54,7 +54,6 @@ import org.ballerinalang.langserver.completions.TypeCompletionItem; import org.eclipse.lsp4j.CompletionItemKind; -import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Optional; @@ -685,17 +684,14 @@ public static void sortCompletionsAfterConfigurableQualifier(CompletionContext c return; } - List anyDataSubTypeLabels = Arrays.asList("boolean", "int", "float", - "decimal", "string", "xml", "map", "table"); + TypeSymbol anydataType = context.currentSemanticModel().get().types().ANYDATA; completionItems.forEach(lsCompletionItem -> { String sortText; - if (lsCompletionItem.getCompletionItem().getKind() == CompletionItemKind.Unit && - lsCompletionItem.getType() == SYMBOL) { + if (lsCompletionItem.getType() == SYMBOL) { Optional symbol = ((SymbolCompletionItem) lsCompletionItem).getSymbol(); - if (symbol.isPresent() && symbol.get() instanceof ModuleSymbol && - CommonUtil.isLangLib(((ModuleSymbol) symbol.get()).id()) && - anyDataSubTypeLabels.contains(lsCompletionItem.getCompletionItem().getLabel()) - ) { + if (symbol.isPresent() && + symbol.get() instanceof TypeSymbol && + ((TypeSymbol) symbol.get()).subtypeOf(anydataType)) { sortText = SortingUtil.genSortText(1); } else { sortText = SortingUtil.genSortText(3); diff --git a/language-server/modules/langserver-core/src/test/java/org/ballerinalang/langserver/codeaction/AddCheckCodeActionTest.java b/language-server/modules/langserver-core/src/test/java/org/ballerinalang/langserver/codeaction/AddCheckCodeActionTest.java index 3361ccbc24f7..ac07b8a22804 100644 --- a/language-server/modules/langserver-core/src/test/java/org/ballerinalang/langserver/codeaction/AddCheckCodeActionTest.java +++ b/language-server/modules/langserver-core/src/test/java/org/ballerinalang/langserver/codeaction/AddCheckCodeActionTest.java @@ -52,7 +52,9 @@ public Object[][] dataProvider() { {"add_check_codeaction_wait_action_config1.json"}, {"add_check_in_local_var1.json"}, {"add_check_in_local_var2.json"}, - {"add_check_in_module_var.json"} + {"add_check_in_module_var.json"}, + {"add_check_on_field_access_config1.json"}, + {"add_check_on_field_access_config2.json"} }; } diff --git a/language-server/modules/langserver-core/src/test/java/org/ballerinalang/langserver/codeaction/TypeGuardTest.java b/language-server/modules/langserver-core/src/test/java/org/ballerinalang/langserver/codeaction/TypeGuardTest.java index 7e4585796815..b837b52020d2 100644 --- a/language-server/modules/langserver-core/src/test/java/org/ballerinalang/langserver/codeaction/TypeGuardTest.java +++ b/language-server/modules/langserver-core/src/test/java/org/ballerinalang/langserver/codeaction/TypeGuardTest.java @@ -51,6 +51,7 @@ public Object[][] dataProvider() { {"typeGuardVariableCodeAction1.json"}, {"typeGuardVariableCodeAction3.json"}, {"typeGuardWithTuple1.json"}, + {"typeGuardErrorType1.json"}, }; } diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/config/add_check_on_field_access_config1.json b/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/config/add_check_on_field_access_config1.json new file mode 100644 index 000000000000..6e48bb6baa22 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/config/add_check_on_field_access_config1.json @@ -0,0 +1,54 @@ +{ + "position": { + "line": 7, + "character": 20 + }, + "source": "add_check_on_field_access_source1.bal", + "expected": [ + { + "title": "Add 'check' error", + "kind": "quickfix", + "edits": [ + { + "range": { + "start": { + "line": 7, + "character": 17 + }, + "end": { + "line": 7, + "character": 17 + } + }, + "newText": "(" + }, + { + "range": { + "start": { + "line": 7, + "character": 23 + }, + "end": { + "line": 7, + "character": 23 + } + }, + "newText": ")" + }, + { + "range": { + "start": { + "line": 7, + "character": 17 + }, + "end": { + "line": 7, + "character": 17 + } + }, + "newText": "check " + } + ] + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/config/add_check_on_field_access_config2.json b/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/config/add_check_on_field_access_config2.json new file mode 100644 index 000000000000..e6240d398618 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/config/add_check_on_field_access_config2.json @@ -0,0 +1,28 @@ +{ + "position": { + "line": 7, + "character": 20 + }, + "source": "add_check_on_field_access_source2.bal", + "expected": [ + { + "title": "Add 'check' error", + "kind": "quickfix", + "edits": [ + { + "range": { + "start": { + "line": 7, + "character": 18 + }, + "end": { + "line": 7, + "character": 18 + } + }, + "newText": "check " + } + ] + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/source/add_check_on_field_access_source1.bal b/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/source/add_check_on_field_access_source1.bal new file mode 100644 index 000000000000..d6c41776115c --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/source/add_check_on_field_access_source1.bal @@ -0,0 +1,9 @@ +type Data record {| + json|error field1; +|}; + + +function toString(Data data) returns error? { + json|error field1 = data.field1; + string str = field1.toString(); +} diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/source/add_check_on_field_access_source2.bal b/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/source/add_check_on_field_access_source2.bal new file mode 100644 index 000000000000..109790077433 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/source/add_check_on_field_access_source2.bal @@ -0,0 +1,9 @@ +type Data record {| + json|error field1; +|}; + + +function toString(Data data) returns error? { + json|error field1 = data.field1; + string str = (field1).toString(); +} diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/create-variable/config-rename-positional-capability/createVariableWithRemoteMethodInvocation.json b/language-server/modules/langserver-core/src/test/resources/codeaction/create-variable/config-rename-positional-capability/createVariableWithRemoteMethodInvocation.json index 0f683ec139bf..5e729a2612e2 100644 --- a/language-server/modules/langserver-core/src/test/resources/codeaction/create-variable/config-rename-positional-capability/createVariableWithRemoteMethodInvocation.json +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/create-variable/config-rename-positional-capability/createVariableWithRemoteMethodInvocation.json @@ -34,19 +34,6 @@ } }, "newText": "\n if sayHello is HelloReply {\n\n }" - }, - { - "range": { - "start": { - "line": 22, - "character": 38 - }, - "end": { - "line": 22, - "character": 38 - } - }, - "newText": "\n if sayHello is E1 {\n\n }" } ], "command": { diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/create-variable/config/createVariableWithRemoteMethodInvocation.json b/language-server/modules/langserver-core/src/test/resources/codeaction/create-variable/config/createVariableWithRemoteMethodInvocation.json index cc6db4617673..107657493b15 100644 --- a/language-server/modules/langserver-core/src/test/resources/codeaction/create-variable/config/createVariableWithRemoteMethodInvocation.json +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/create-variable/config/createVariableWithRemoteMethodInvocation.json @@ -34,19 +34,6 @@ } }, "newText": "\n if sayHello is HelloReply {\n\n }" - }, - { - "range": { - "start": { - "line": 22, - "character": 38 - }, - "end": { - "line": 22, - "character": 38 - } - }, - "newText": "\n if sayHello is E1 {\n\n }" } ], "command": { diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/type-guard/config/typeGuardErrorType1.json b/language-server/modules/langserver-core/src/test/resources/codeaction/type-guard/config/typeGuardErrorType1.json new file mode 100644 index 000000000000..a453e90f3ad3 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/type-guard/config/typeGuardErrorType1.json @@ -0,0 +1,42 @@ +{ + "position": { + "line": 1, + "character": 5 + }, + "source": "typeGuardErrorType.bal", + "expected": [ + { + "title": "Create variable and type guard", + "kind": "quickfix", + "edits": [ + { + "range": { + "start": { + "line": 1, + "character": 4 + }, + "end": { + "line": 1, + "character": 4 + } + }, + "newText": "Foo? barResult = " + }, + { + "range": { + "start": { + "line": 1, + "character": 10 + }, + "end": { + "line": 1, + "character": 10 + } + }, + "newText": "\n if barResult is Foo {\n\n }" + } + ], + "resolvable": false + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/type-guard/source/typeGuardErrorType.bal b/language-server/modules/langserver-core/src/test/resources/codeaction/type-guard/source/typeGuardErrorType.bal new file mode 100644 index 000000000000..bae6b42f8b26 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/type-guard/source/typeGuardErrorType.bal @@ -0,0 +1,8 @@ +public function main() { + bar(); +} + +function bar() returns Foo? { +} + +type Foo error; diff --git a/language-server/modules/langserver-core/src/test/resources/completion/module_part_context/config/config17.json b/language-server/modules/langserver-core/src/test/resources/completion/module_part_context/config/module_level_after_configurable_config1.json similarity index 95% rename from language-server/modules/langserver-core/src/test/resources/completion/module_part_context/config/config17.json rename to language-server/modules/langserver-core/src/test/resources/completion/module_part_context/config/module_level_after_configurable_config1.json index c7655eaf1559..bb5461697f1b 100644 --- a/language-server/modules/langserver-core/src/test/resources/completion/module_part_context/config/config17.json +++ b/language-server/modules/langserver-core/src/test/resources/completion/module_part_context/config/module_level_after_configurable_config1.json @@ -4,6 +4,7 @@ "character": 13 }, "source": "module_part_context/source/source15.bal", + "description": "Test completions after the configurable qualifier followed by a function def", "items": [ { "label": "StrandData", @@ -12,7 +13,7 @@ "documentation": { "left": "Describes Strand execution details for the runtime.\n" }, - "sortText": "B", + "sortText": "C", "insertText": "StrandData", "insertTextFormat": "Snippet" }, @@ -20,7 +21,7 @@ "label": "Thread", "kind": "TypeParameter", "detail": "Union", - "sortText": "B", + "sortText": "C", "insertText": "Thread", "insertTextFormat": "Snippet" }, @@ -334,7 +335,7 @@ "label": "map", "kind": "Unit", "detail": "type", - "sortText": "A", + "sortText": "C", "insertText": "map", "insertTextFormat": "Snippet" }, @@ -358,7 +359,7 @@ "label": "table", "kind": "Unit", "detail": "type", - "sortText": "A", + "sortText": "C", "insertText": "table", "insertTextFormat": "Snippet" }, @@ -398,7 +399,7 @@ "label": "readonly", "kind": "TypeParameter", "detail": "Readonly", - "sortText": "B", + "sortText": "C", "insertText": "readonly", "insertTextFormat": "Snippet" }, @@ -406,7 +407,7 @@ "label": "handle", "kind": "TypeParameter", "detail": "Handle", - "sortText": "B", + "sortText": "C", "insertText": "handle", "insertTextFormat": "Snippet" }, @@ -414,7 +415,7 @@ "label": "never", "kind": "TypeParameter", "detail": "Never", - "sortText": "B", + "sortText": "A", "insertText": "never", "insertTextFormat": "Snippet" }, @@ -422,7 +423,7 @@ "label": "json", "kind": "TypeParameter", "detail": "Json", - "sortText": "B", + "sortText": "A", "insertText": "json", "insertTextFormat": "Snippet" }, @@ -430,7 +431,7 @@ "label": "anydata", "kind": "TypeParameter", "detail": "Anydata", - "sortText": "B", + "sortText": "A", "insertText": "anydata", "insertTextFormat": "Snippet" }, @@ -438,7 +439,7 @@ "label": "any", "kind": "TypeParameter", "detail": "Any", - "sortText": "B", + "sortText": "C", "insertText": "any", "insertTextFormat": "Snippet" }, @@ -446,7 +447,7 @@ "label": "byte", "kind": "TypeParameter", "detail": "Byte", - "sortText": "B", + "sortText": "A", "insertText": "byte", "insertTextFormat": "Snippet" }, @@ -463,7 +464,7 @@ "label": "decimal", "kind": "TypeParameter", "detail": "Decimal", - "sortText": "B", + "sortText": "A", "insertText": "decimal", "insertTextFormat": "Snippet" }, @@ -471,7 +472,7 @@ "label": "error", "kind": "Event", "detail": "Error", - "sortText": "D", + "sortText": "C", "insertText": "error", "insertTextFormat": "Snippet" }, @@ -479,7 +480,7 @@ "label": "xml", "kind": "TypeParameter", "detail": "Xml", - "sortText": "B", + "sortText": "A", "insertText": "xml", "insertTextFormat": "Snippet" }, @@ -487,7 +488,7 @@ "label": "boolean", "kind": "TypeParameter", "detail": "Boolean", - "sortText": "B", + "sortText": "A", "insertText": "boolean", "insertTextFormat": "Snippet" }, @@ -495,7 +496,7 @@ "label": "future", "kind": "TypeParameter", "detail": "Future", - "sortText": "B", + "sortText": "C", "insertText": "future", "insertTextFormat": "Snippet" }, @@ -503,7 +504,7 @@ "label": "int", "kind": "TypeParameter", "detail": "Int", - "sortText": "B", + "sortText": "A", "insertText": "int", "insertTextFormat": "Snippet" }, @@ -511,7 +512,7 @@ "label": "float", "kind": "TypeParameter", "detail": "Float", - "sortText": "B", + "sortText": "A", "insertText": "float", "insertTextFormat": "Snippet" }, @@ -519,7 +520,7 @@ "label": "function", "kind": "TypeParameter", "detail": "Function", - "sortText": "B", + "sortText": "C", "insertText": "function", "insertTextFormat": "Snippet" }, @@ -527,7 +528,7 @@ "label": "string", "kind": "TypeParameter", "detail": "String", - "sortText": "B", + "sortText": "A", "insertText": "string", "insertTextFormat": "Snippet" }, @@ -535,7 +536,7 @@ "label": "typedesc", "kind": "TypeParameter", "detail": "Typedesc", - "sortText": "B", + "sortText": "C", "insertText": "typedesc", "insertTextFormat": "Snippet" } diff --git a/language-server/modules/langserver-core/src/test/resources/completion/module_part_context/config/config18.json b/language-server/modules/langserver-core/src/test/resources/completion/module_part_context/config/module_level_after_configurable_config2.json similarity index 97% rename from language-server/modules/langserver-core/src/test/resources/completion/module_part_context/config/config18.json rename to language-server/modules/langserver-core/src/test/resources/completion/module_part_context/config/module_level_after_configurable_config2.json index b08be52e1a72..22b4bf9208de 100644 --- a/language-server/modules/langserver-core/src/test/resources/completion/module_part_context/config/config18.json +++ b/language-server/modules/langserver-core/src/test/resources/completion/module_part_context/config/module_level_after_configurable_config2.json @@ -4,6 +4,7 @@ "character": 21 }, "source": "module_part_context/source/source16.bal", + "description": "Test completions after configurable keyword with qualified name ref", "items": [ { "label": "AnnotationType", diff --git a/language-server/modules/langserver-core/src/test/resources/completion/module_part_context/config/module_level_after_configurable_config3.json b/language-server/modules/langserver-core/src/test/resources/completion/module_part_context/config/module_level_after_configurable_config3.json new file mode 100644 index 000000000000..25513351fa36 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/completion/module_part_context/config/module_level_after_configurable_config3.json @@ -0,0 +1,802 @@ +{ + "position": { + "line": 1, + "character": 13 + }, + "source": "module_part_context/source/source17.bal", + "description": "Test completions after the configurable keyword followed by a main function in next line", + "items": [ + { + "label": "StrandData", + "kind": "Struct", + "detail": "Record", + "documentation": { + "left": "Describes Strand execution details for the runtime.\n" + }, + "sortText": "C", + "insertText": "StrandData", + "insertTextFormat": "Snippet" + }, + { + "label": "Thread", + "kind": "TypeParameter", + "detail": "Union", + "sortText": "C", + "insertText": "Thread", + "insertTextFormat": "Snippet" + }, + { + "label": "readonly", + "kind": "TypeParameter", + "detail": "Readonly", + "sortText": "C", + "insertText": "readonly", + "insertTextFormat": "Snippet" + }, + { + "label": "handle", + "kind": "TypeParameter", + "detail": "Handle", + "sortText": "C", + "insertText": "handle", + "insertTextFormat": "Snippet" + }, + { + "label": "never", + "kind": "TypeParameter", + "detail": "Never", + "sortText": "A", + "insertText": "never", + "insertTextFormat": "Snippet" + }, + { + "label": "json", + "kind": "TypeParameter", + "detail": "Json", + "sortText": "A", + "insertText": "json", + "insertTextFormat": "Snippet" + }, + { + "label": "anydata", + "kind": "TypeParameter", + "detail": "Anydata", + "sortText": "A", + "insertText": "anydata", + "insertTextFormat": "Snippet" + }, + { + "label": "any", + "kind": "TypeParameter", + "detail": "Any", + "sortText": "C", + "insertText": "any", + "insertTextFormat": "Snippet" + }, + { + "label": "byte", + "kind": "TypeParameter", + "detail": "Byte", + "sortText": "A", + "insertText": "byte", + "insertTextFormat": "Snippet" + }, + { + "label": "service", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "D", + "filterText": "service", + "insertText": "service", + "insertTextFormat": "Snippet" + }, + { + "label": "record", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "D", + "filterText": "record", + "insertText": "record ", + "insertTextFormat": "Snippet" + }, + { + "label": "function", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "D", + "filterText": "function", + "insertText": "function ", + "insertTextFormat": "Snippet" + }, + { + "label": "record {}", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "D", + "filterText": "record", + "insertText": "record {${1}}", + "insertTextFormat": "Snippet" + }, + { + "label": "record {||}", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "D", + "filterText": "record", + "insertText": "record {|${1}|}", + "insertTextFormat": "Snippet" + }, + { + "label": "distinct", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "D", + "filterText": "distinct", + "insertText": "distinct", + "insertTextFormat": "Snippet" + }, + { + "label": "object {}", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "D", + "filterText": "object", + "insertText": "object {${1}}", + "insertTextFormat": "Snippet" + }, + { + "label": "true", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "D", + "filterText": "true", + "insertText": "true", + "insertTextFormat": "Snippet" + }, + { + "label": "false", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "D", + "filterText": "false", + "insertText": "false", + "insertTextFormat": "Snippet" + }, + { + "label": "null", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "D", + "filterText": "null", + "insertText": "null", + "insertTextFormat": "Snippet" + }, + { + "label": "test/project2", + "kind": "Module", + "detail": "Module", + "sortText": "C", + "filterText": "project2", + "insertText": "project2", + "insertTextFormat": "Snippet", + "additionalTextEdits": [ + { + "range": { + "start": { + "line": 0, + "character": 0 + }, + "end": { + "line": 0, + "character": 0 + } + }, + "newText": "import test/project2;\n" + } + ] + }, + { + "label": "test/project1", + "kind": "Module", + "detail": "Module", + "sortText": "C", + "filterText": "project1", + "insertText": "project1", + "insertTextFormat": "Snippet", + "additionalTextEdits": [ + { + "range": { + "start": { + "line": 0, + "character": 0 + }, + "end": { + "line": 0, + "character": 0 + } + }, + "newText": "import test/project1;\n" + } + ] + }, + { + "label": "ballerina/lang.runtime", + "kind": "Module", + "detail": "Module", + "sortText": "C", + "filterText": "runtime", + "insertText": "runtime", + "insertTextFormat": "Snippet", + "additionalTextEdits": [ + { + "range": { + "start": { + "line": 0, + "character": 0 + }, + "end": { + "line": 0, + "character": 0 + } + }, + "newText": "import ballerina/lang.runtime;\n" + } + ] + }, + { + "label": "ballerina/lang.regexp", + "kind": "Module", + "detail": "Module", + "sortText": "C", + "filterText": "regexp", + "insertText": "regexp", + "insertTextFormat": "Snippet", + "additionalTextEdits": [ + { + "range": { + "start": { + "line": 0, + "character": 0 + }, + "end": { + "line": 0, + "character": 0 + } + }, + "newText": "import ballerina/lang.regexp;\n" + } + ] + }, + { + "label": "ballerina/module1", + "kind": "Module", + "detail": "Module", + "sortText": "C", + "filterText": "module1", + "insertText": "module1", + "insertTextFormat": "Snippet", + "additionalTextEdits": [ + { + "range": { + "start": { + "line": 0, + "character": 0 + }, + "end": { + "line": 0, + "character": 0 + } + }, + "newText": "import ballerina/module1;\n" + } + ] + }, + { + "label": "ballerina/lang.test", + "kind": "Module", + "detail": "Module", + "sortText": "C", + "filterText": "test", + "insertText": "test", + "insertTextFormat": "Snippet", + "additionalTextEdits": [ + { + "range": { + "start": { + "line": 0, + "character": 0 + }, + "end": { + "line": 0, + "character": 0 + } + }, + "newText": "import ballerina/lang.test;\n" + } + ] + }, + { + "label": "test/local_project2", + "kind": "Module", + "detail": "Module", + "sortText": "C", + "filterText": "local_project2", + "insertText": "local_project2", + "insertTextFormat": "Snippet", + "additionalTextEdits": [ + { + "range": { + "start": { + "line": 0, + "character": 0 + }, + "end": { + "line": 0, + "character": 0 + } + }, + "newText": "import test/local_project2;\n" + } + ] + }, + { + "label": "test/local_project1", + "kind": "Module", + "detail": "Module", + "sortText": "C", + "filterText": "local_project1", + "insertText": "local_project1", + "insertTextFormat": "Snippet", + "additionalTextEdits": [ + { + "range": { + "start": { + "line": 0, + "character": 0 + }, + "end": { + "line": 0, + "character": 0 + } + }, + "newText": "import test/local_project1;\n" + } + ] + }, + { + "label": "ballerina/lang.value", + "kind": "Module", + "detail": "Module", + "sortText": "C", + "filterText": "value", + "insertText": "value", + "insertTextFormat": "Snippet", + "additionalTextEdits": [ + { + "range": { + "start": { + "line": 0, + "character": 0 + }, + "end": { + "line": 0, + "character": 0 + } + }, + "newText": "import ballerina/lang.value;\n" + } + ] + }, + { + "label": "ballerina/jballerina.java", + "kind": "Module", + "detail": "Module", + "sortText": "C", + "filterText": "java", + "insertText": "java", + "insertTextFormat": "Snippet", + "additionalTextEdits": [ + { + "range": { + "start": { + "line": 0, + "character": 0 + }, + "end": { + "line": 0, + "character": 0 + } + }, + "newText": "import ballerina/jballerina.java;\n" + } + ] + }, + { + "label": "ballerina/lang.array", + "kind": "Module", + "detail": "Module", + "sortText": "C", + "filterText": "array", + "insertText": "array", + "insertTextFormat": "Snippet", + "additionalTextEdits": [ + { + "range": { + "start": { + "line": 0, + "character": 0 + }, + "end": { + "line": 0, + "character": 0 + } + }, + "newText": "import ballerina/lang.array;\n" + } + ] + }, + { + "label": "decimal", + "kind": "TypeParameter", + "detail": "Decimal", + "sortText": "A", + "insertText": "decimal", + "insertTextFormat": "Snippet" + }, + { + "label": "error", + "kind": "Event", + "detail": "Error", + "sortText": "C", + "insertText": "error", + "insertTextFormat": "Snippet" + }, + { + "label": "object", + "kind": "Unit", + "detail": "type", + "sortText": "C", + "insertText": "object", + "insertTextFormat": "Snippet" + }, + { + "label": "transaction", + "kind": "Unit", + "detail": "type", + "sortText": "C", + "insertText": "transaction", + "insertTextFormat": "Snippet" + }, + { + "label": "xml", + "kind": "TypeParameter", + "detail": "Xml", + "sortText": "A", + "insertText": "xml", + "insertTextFormat": "Snippet" + }, + { + "label": "table", + "kind": "Unit", + "detail": "type", + "sortText": "C", + "insertText": "table", + "insertTextFormat": "Snippet" + }, + { + "label": "map", + "kind": "Unit", + "detail": "type", + "sortText": "C", + "insertText": "map", + "insertTextFormat": "Snippet" + }, + { + "label": "stream", + "kind": "Unit", + "detail": "type", + "sortText": "C", + "insertText": "stream", + "insertTextFormat": "Snippet" + }, + { + "label": "boolean", + "kind": "TypeParameter", + "detail": "Boolean", + "sortText": "A", + "insertText": "boolean", + "insertTextFormat": "Snippet" + }, + { + "label": "future", + "kind": "TypeParameter", + "detail": "Future", + "sortText": "C", + "insertText": "future", + "insertTextFormat": "Snippet" + }, + { + "label": "int", + "kind": "TypeParameter", + "detail": "Int", + "sortText": "A", + "insertText": "int", + "insertTextFormat": "Snippet" + }, + { + "label": "float", + "kind": "TypeParameter", + "detail": "Float", + "sortText": "A", + "insertText": "float", + "insertTextFormat": "Snippet" + }, + { + "label": "function", + "kind": "TypeParameter", + "detail": "Function", + "sortText": "C", + "insertText": "function", + "insertTextFormat": "Snippet" + }, + { + "label": "string", + "kind": "TypeParameter", + "detail": "String", + "sortText": "A", + "insertText": "string", + "insertTextFormat": "Snippet" + }, + { + "label": "typedesc", + "kind": "TypeParameter", + "detail": "Typedesc", + "sortText": "C", + "insertText": "typedesc", + "insertTextFormat": "Snippet" + }, + { + "label": "type", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "D", + "filterText": "type", + "insertText": "type ", + "insertTextFormat": "Snippet" + }, + { + "label": "isolated", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "D", + "filterText": "isolated", + "insertText": "isolated ", + "insertTextFormat": "Snippet" + }, + { + "label": "final", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "D", + "filterText": "final", + "insertText": "final ", + "insertTextFormat": "Snippet" + }, + { + "label": "const", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "D", + "filterText": "const", + "insertText": "const ", + "insertTextFormat": "Snippet" + }, + { + "label": "listener", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "D", + "filterText": "listener", + "insertText": "listener ", + "insertTextFormat": "Snippet" + }, + { + "label": "client", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "D", + "filterText": "client", + "insertText": "client ", + "insertTextFormat": "Snippet" + }, + { + "label": "var", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "D", + "filterText": "var", + "insertText": "var ", + "insertTextFormat": "Snippet" + }, + { + "label": "enum", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "D", + "filterText": "enum", + "insertText": "enum ", + "insertTextFormat": "Snippet" + }, + { + "label": "xmlns", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "D", + "filterText": "xmlns", + "insertText": "xmlns ", + "insertTextFormat": "Snippet" + }, + { + "label": "class", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "D", + "filterText": "class", + "insertText": "class ", + "insertTextFormat": "Snippet" + }, + { + "label": "transactional", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "D", + "filterText": "transactional", + "insertText": "transactional", + "insertTextFormat": "Snippet" + }, + { + "label": "function", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "D", + "filterText": "function", + "insertText": "function ${1:name}(${2})${3} {\n\t${4}\n}", + "insertTextFormat": "Snippet" + }, + { + "label": "function (..) => ", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "D", + "filterText": "function", + "insertText": "function ${1:name}(${2})${3} => (${4});", + "insertTextFormat": "Snippet" + }, + { + "label": "public main function", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "D", + "filterText": "public_function_main", + "insertText": "public function main() {\n\t${1}\n}", + "insertTextFormat": "Snippet" + }, + { + "label": "configurable", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "D", + "filterText": "configurable", + "insertText": "configurable", + "insertTextFormat": "Snippet" + }, + { + "label": "annotation", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "D", + "filterText": "annotation", + "insertText": "annotation ${1:typeName} ${2:name} on ${3:attachmentPoint};", + "insertTextFormat": "Snippet" + }, + { + "label": "type record {}", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "D", + "filterText": "type_record", + "insertText": "type ${1:RecordName} record {\n\t${2}\n};", + "insertTextFormat": "Snippet" + }, + { + "label": "xmlns", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "D", + "filterText": "xmlns", + "insertText": "xmlns \"${1}\" as ${2:ns};", + "insertTextFormat": "Snippet" + }, + { + "label": "type object", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "D", + "filterText": "type_object", + "insertText": "type ${1:ObjectName} object {${2}};", + "insertTextFormat": "Snippet" + }, + { + "label": "class", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "D", + "filterText": "class", + "insertText": "class ${1:className} {\n\t${2}\n}", + "insertTextFormat": "Snippet" + }, + { + "label": "enum", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "D", + "filterText": "enum", + "insertText": "enum ${1:enumName} {\n\t${2}\n}", + "insertTextFormat": "Snippet" + }, + { + "label": "type record {||}", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "D", + "filterText": "type_record", + "insertText": "type ${1:RecordName} record {|\n\t${2}\n|};", + "insertTextFormat": "Snippet" + }, + { + "label": "type error", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "D", + "filterText": "type_error", + "insertText": "type ${1:ErrorName} error<${2:map}>;", + "insertTextFormat": "Snippet" + }, + { + "label": "type TypeName table<>;", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "D", + "filterText": "type_table", + "insertText": "type ${1:TypeName} table<${2}>;", + "insertTextFormat": "Snippet" + }, + { + "label": "type TypeName table<> key", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "D", + "filterText": "type_table_key", + "insertText": "type ${1:TypeName} table<${2}> key${3}", + "insertTextFormat": "Snippet" + }, + { + "label": "stream<> streamName = new;", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "D", + "filterText": "stream", + "insertText": "stream<${1}> ${2:streamName} = new;", + "insertTextFormat": "Snippet" + }, + { + "label": "service", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "D", + "filterText": "service", + "insertText": "service on ${1:listenerName} {\n\t${2}\n}", + "insertTextFormat": "Snippet" + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/completion/module_part_context/source/source17.bal b/language-server/modules/langserver-core/src/test/resources/completion/module_part_context/source/source17.bal new file mode 100644 index 000000000000..5c7cd312eedc --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/completion/module_part_context/source/source17.bal @@ -0,0 +1,6 @@ + +configurable + +public function main() { + +} \ No newline at end of file diff --git a/language-server/modules/langserver-core/src/test/resources/completion/module_var_context/config/config14.json b/language-server/modules/langserver-core/src/test/resources/completion/module_var_context/config/config14.json index 10e7f341d008..435fcc5a7e33 100644 --- a/language-server/modules/langserver-core/src/test/resources/completion/module_var_context/config/config14.json +++ b/language-server/modules/langserver-core/src/test/resources/completion/module_var_context/config/config14.json @@ -4,12 +4,13 @@ "character": 13 }, "source": "module_var_context/source/source14.bal", + "description": "Test completions between configurable keyword and variable name", "items": [ { "label": "map", "kind": "Unit", "detail": "type", - "sortText": "A", + "sortText": "C", "insertText": "map", "insertTextFormat": "Snippet" }, @@ -17,7 +18,7 @@ "label": "table", "kind": "Unit", "detail": "type", - "sortText": "A", + "sortText": "C", "insertText": "table", "insertTextFormat": "Snippet" }, @@ -28,7 +29,7 @@ "documentation": { "left": "Describes Strand execution details for the runtime.\n" }, - "sortText": "B", + "sortText": "C", "insertText": "StrandData", "insertTextFormat": "Snippet" }, @@ -36,7 +37,7 @@ "label": "Thread", "kind": "TypeParameter", "detail": "Union", - "sortText": "B", + "sortText": "C", "insertText": "Thread", "insertTextFormat": "Snippet" }, @@ -413,7 +414,7 @@ "label": "readonly", "kind": "TypeParameter", "detail": "Readonly", - "sortText": "B", + "sortText": "C", "insertText": "readonly", "insertTextFormat": "Snippet" }, @@ -421,7 +422,7 @@ "label": "handle", "kind": "TypeParameter", "detail": "Handle", - "sortText": "B", + "sortText": "C", "insertText": "handle", "insertTextFormat": "Snippet" }, @@ -429,7 +430,7 @@ "label": "never", "kind": "TypeParameter", "detail": "Never", - "sortText": "B", + "sortText": "A", "insertText": "never", "insertTextFormat": "Snippet" }, @@ -437,7 +438,7 @@ "label": "json", "kind": "TypeParameter", "detail": "Json", - "sortText": "B", + "sortText": "A", "insertText": "json", "insertTextFormat": "Snippet" }, @@ -445,7 +446,7 @@ "label": "anydata", "kind": "TypeParameter", "detail": "Anydata", - "sortText": "B", + "sortText": "A", "insertText": "anydata", "insertTextFormat": "Snippet" }, @@ -453,7 +454,7 @@ "label": "any", "kind": "TypeParameter", "detail": "Any", - "sortText": "B", + "sortText": "C", "insertText": "any", "insertTextFormat": "Snippet" }, @@ -461,7 +462,7 @@ "label": "byte", "kind": "TypeParameter", "detail": "Byte", - "sortText": "B", + "sortText": "A", "insertText": "byte", "insertTextFormat": "Snippet" }, @@ -478,7 +479,7 @@ "label": "decimal", "kind": "TypeParameter", "detail": "Decimal", - "sortText": "B", + "sortText": "A", "insertText": "decimal", "insertTextFormat": "Snippet" }, @@ -486,7 +487,7 @@ "label": "error", "kind": "Event", "detail": "Error", - "sortText": "D", + "sortText": "C", "insertText": "error", "insertTextFormat": "Snippet" }, @@ -494,7 +495,7 @@ "label": "xml", "kind": "TypeParameter", "detail": "Xml", - "sortText": "B", + "sortText": "A", "insertText": "xml", "insertTextFormat": "Snippet" }, @@ -502,7 +503,7 @@ "label": "boolean", "kind": "TypeParameter", "detail": "Boolean", - "sortText": "B", + "sortText": "A", "insertText": "boolean", "insertTextFormat": "Snippet" }, @@ -510,7 +511,7 @@ "label": "future", "kind": "TypeParameter", "detail": "Future", - "sortText": "B", + "sortText": "C", "insertText": "future", "insertTextFormat": "Snippet" }, @@ -518,7 +519,7 @@ "label": "int", "kind": "TypeParameter", "detail": "Int", - "sortText": "B", + "sortText": "A", "insertText": "int", "insertTextFormat": "Snippet" }, @@ -526,7 +527,7 @@ "label": "float", "kind": "TypeParameter", "detail": "Float", - "sortText": "B", + "sortText": "A", "insertText": "float", "insertTextFormat": "Snippet" }, @@ -534,7 +535,7 @@ "label": "function", "kind": "TypeParameter", "detail": "Function", - "sortText": "B", + "sortText": "C", "insertText": "function", "insertTextFormat": "Snippet" }, @@ -542,7 +543,7 @@ "label": "string", "kind": "TypeParameter", "detail": "String", - "sortText": "B", + "sortText": "A", "insertText": "string", "insertTextFormat": "Snippet" }, @@ -550,7 +551,7 @@ "label": "typedesc", "kind": "TypeParameter", "detail": "Typedesc", - "sortText": "B", + "sortText": "C", "insertText": "typedesc", "insertTextFormat": "Snippet" } diff --git a/language-server/modules/langserver-core/src/test/resources/completion/module_var_context/config/config15.json b/language-server/modules/langserver-core/src/test/resources/completion/module_var_context/config/config15.json index af619023d835..cb24ada0c7ed 100644 --- a/language-server/modules/langserver-core/src/test/resources/completion/module_var_context/config/config15.json +++ b/language-server/modules/langserver-core/src/test/resources/completion/module_var_context/config/config15.json @@ -4,12 +4,13 @@ "character": 14 }, "source": "module_var_context/source/source15.bal", + "description": "Test completions after configurable keyword in an empty file", "items": [ { "label": "Thread", "kind": "TypeParameter", "detail": "Union", - "sortText": "B", + "sortText": "C", "insertText": "Thread", "insertTextFormat": "Snippet" }, @@ -20,7 +21,7 @@ "documentation": { "left": "Describes Strand execution details for the runtime.\n" }, - "sortText": "B", + "sortText": "C", "insertText": "StrandData", "insertTextFormat": "Snippet" }, @@ -349,7 +350,7 @@ "label": "map", "kind": "Unit", "detail": "type", - "sortText": "A", + "sortText": "C", "insertText": "map", "insertTextFormat": "Snippet" }, @@ -373,7 +374,7 @@ "label": "table", "kind": "Unit", "detail": "type", - "sortText": "A", + "sortText": "C", "insertText": "table", "insertTextFormat": "Snippet" }, @@ -413,7 +414,7 @@ "label": "readonly", "kind": "TypeParameter", "detail": "Readonly", - "sortText": "B", + "sortText": "C", "insertText": "readonly", "insertTextFormat": "Snippet" }, @@ -421,7 +422,7 @@ "label": "handle", "kind": "TypeParameter", "detail": "Handle", - "sortText": "B", + "sortText": "C", "insertText": "handle", "insertTextFormat": "Snippet" }, @@ -429,7 +430,7 @@ "label": "never", "kind": "TypeParameter", "detail": "Never", - "sortText": "B", + "sortText": "A", "insertText": "never", "insertTextFormat": "Snippet" }, @@ -437,7 +438,7 @@ "label": "json", "kind": "TypeParameter", "detail": "Json", - "sortText": "B", + "sortText": "A", "insertText": "json", "insertTextFormat": "Snippet" }, @@ -445,7 +446,7 @@ "label": "anydata", "kind": "TypeParameter", "detail": "Anydata", - "sortText": "B", + "sortText": "A", "insertText": "anydata", "insertTextFormat": "Snippet" }, @@ -453,7 +454,7 @@ "label": "any", "kind": "TypeParameter", "detail": "Any", - "sortText": "B", + "sortText": "C", "insertText": "any", "insertTextFormat": "Snippet" }, @@ -461,7 +462,7 @@ "label": "byte", "kind": "TypeParameter", "detail": "Byte", - "sortText": "B", + "sortText": "A", "insertText": "byte", "insertTextFormat": "Snippet" }, @@ -478,7 +479,7 @@ "label": "decimal", "kind": "TypeParameter", "detail": "Decimal", - "sortText": "B", + "sortText": "A", "insertText": "decimal", "insertTextFormat": "Snippet" }, @@ -486,7 +487,7 @@ "label": "error", "kind": "Event", "detail": "Error", - "sortText": "D", + "sortText": "C", "insertText": "error", "insertTextFormat": "Snippet" }, @@ -494,7 +495,7 @@ "label": "xml", "kind": "TypeParameter", "detail": "Xml", - "sortText": "B", + "sortText": "A", "insertText": "xml", "insertTextFormat": "Snippet" }, @@ -502,7 +503,7 @@ "label": "boolean", "kind": "TypeParameter", "detail": "Boolean", - "sortText": "B", + "sortText": "A", "insertText": "boolean", "insertTextFormat": "Snippet" }, @@ -510,7 +511,7 @@ "label": "future", "kind": "TypeParameter", "detail": "Future", - "sortText": "B", + "sortText": "C", "insertText": "future", "insertTextFormat": "Snippet" }, @@ -518,7 +519,7 @@ "label": "int", "kind": "TypeParameter", "detail": "Int", - "sortText": "B", + "sortText": "A", "insertText": "int", "insertTextFormat": "Snippet" }, @@ -526,7 +527,7 @@ "label": "float", "kind": "TypeParameter", "detail": "Float", - "sortText": "B", + "sortText": "A", "insertText": "float", "insertTextFormat": "Snippet" }, @@ -534,7 +535,7 @@ "label": "function", "kind": "TypeParameter", "detail": "Function", - "sortText": "B", + "sortText": "C", "insertText": "function", "insertTextFormat": "Snippet" }, @@ -542,7 +543,7 @@ "label": "string", "kind": "TypeParameter", "detail": "String", - "sortText": "B", + "sortText": "A", "insertText": "string", "insertTextFormat": "Snippet" }, @@ -550,7 +551,7 @@ "label": "typedesc", "kind": "TypeParameter", "detail": "Typedesc", - "sortText": "B", + "sortText": "C", "insertText": "typedesc", "insertTextFormat": "Snippet" } diff --git a/language-server/modules/langserver-core/src/test/resources/completion/module_var_context/config/config16.json b/language-server/modules/langserver-core/src/test/resources/completion/module_var_context/config/config16.json index 4ef915507d75..fe2523cf14c4 100644 --- a/language-server/modules/langserver-core/src/test/resources/completion/module_var_context/config/config16.json +++ b/language-server/modules/langserver-core/src/test/resources/completion/module_var_context/config/config16.json @@ -4,12 +4,13 @@ "character": 14 }, "source": "module_var_context/source/source16.bal", + "description": "Test completions after configurable followed by a function def", "items": [ { "label": "Thread", "kind": "TypeParameter", "detail": "Union", - "sortText": "B", + "sortText": "C", "insertText": "Thread", "insertTextFormat": "Snippet" }, @@ -20,7 +21,7 @@ "documentation": { "left": "Describes Strand execution details for the runtime.\n" }, - "sortText": "B", + "sortText": "C", "insertText": "StrandData", "insertTextFormat": "Snippet" }, @@ -334,7 +335,7 @@ "label": "map", "kind": "Unit", "detail": "type", - "sortText": "A", + "sortText": "C", "insertText": "map", "insertTextFormat": "Snippet" }, @@ -358,7 +359,7 @@ "label": "table", "kind": "Unit", "detail": "type", - "sortText": "A", + "sortText": "C", "insertText": "table", "insertTextFormat": "Snippet" }, @@ -398,7 +399,7 @@ "label": "readonly", "kind": "TypeParameter", "detail": "Readonly", - "sortText": "B", + "sortText": "C", "insertText": "readonly", "insertTextFormat": "Snippet" }, @@ -406,7 +407,7 @@ "label": "handle", "kind": "TypeParameter", "detail": "Handle", - "sortText": "B", + "sortText": "C", "insertText": "handle", "insertTextFormat": "Snippet" }, @@ -414,7 +415,7 @@ "label": "never", "kind": "TypeParameter", "detail": "Never", - "sortText": "B", + "sortText": "A", "insertText": "never", "insertTextFormat": "Snippet" }, @@ -422,7 +423,7 @@ "label": "json", "kind": "TypeParameter", "detail": "Json", - "sortText": "B", + "sortText": "A", "insertText": "json", "insertTextFormat": "Snippet" }, @@ -430,7 +431,7 @@ "label": "anydata", "kind": "TypeParameter", "detail": "Anydata", - "sortText": "B", + "sortText": "A", "insertText": "anydata", "insertTextFormat": "Snippet" }, @@ -438,7 +439,7 @@ "label": "any", "kind": "TypeParameter", "detail": "Any", - "sortText": "B", + "sortText": "C", "insertText": "any", "insertTextFormat": "Snippet" }, @@ -446,7 +447,7 @@ "label": "byte", "kind": "TypeParameter", "detail": "Byte", - "sortText": "B", + "sortText": "A", "insertText": "byte", "insertTextFormat": "Snippet" }, @@ -463,7 +464,7 @@ "label": "decimal", "kind": "TypeParameter", "detail": "Decimal", - "sortText": "B", + "sortText": "A", "insertText": "decimal", "insertTextFormat": "Snippet" }, @@ -471,7 +472,7 @@ "label": "error", "kind": "Event", "detail": "Error", - "sortText": "D", + "sortText": "C", "insertText": "error", "insertTextFormat": "Snippet" }, @@ -479,7 +480,7 @@ "label": "xml", "kind": "TypeParameter", "detail": "Xml", - "sortText": "B", + "sortText": "A", "insertText": "xml", "insertTextFormat": "Snippet" }, @@ -487,7 +488,7 @@ "label": "boolean", "kind": "TypeParameter", "detail": "Boolean", - "sortText": "B", + "sortText": "A", "insertText": "boolean", "insertTextFormat": "Snippet" }, @@ -495,7 +496,7 @@ "label": "future", "kind": "TypeParameter", "detail": "Future", - "sortText": "B", + "sortText": "C", "insertText": "future", "insertTextFormat": "Snippet" }, @@ -503,7 +504,7 @@ "label": "int", "kind": "TypeParameter", "detail": "Int", - "sortText": "B", + "sortText": "A", "insertText": "int", "insertTextFormat": "Snippet" }, @@ -511,7 +512,7 @@ "label": "float", "kind": "TypeParameter", "detail": "Float", - "sortText": "B", + "sortText": "A", "insertText": "float", "insertTextFormat": "Snippet" }, @@ -519,7 +520,7 @@ "label": "function", "kind": "TypeParameter", "detail": "Function", - "sortText": "B", + "sortText": "C", "insertText": "function", "insertTextFormat": "Snippet" }, @@ -527,7 +528,7 @@ "label": "string", "kind": "TypeParameter", "detail": "String", - "sortText": "B", + "sortText": "A", "insertText": "string", "insertTextFormat": "Snippet" }, @@ -535,7 +536,7 @@ "label": "typedesc", "kind": "TypeParameter", "detail": "Typedesc", - "sortText": "B", + "sortText": "C", "insertText": "typedesc", "insertTextFormat": "Snippet" } diff --git a/language-server/modules/langserver-core/src/test/resources/completion/module_var_context/config/config18.json b/language-server/modules/langserver-core/src/test/resources/completion/module_var_context/config/config18.json index f0ab6f8adf48..86a2eec5e9ad 100644 --- a/language-server/modules/langserver-core/src/test/resources/completion/module_var_context/config/config18.json +++ b/language-server/modules/langserver-core/src/test/resources/completion/module_var_context/config/config18.json @@ -4,12 +4,13 @@ "character": 14 }, "source": "module_var_context/source/source18.bal", + "description": "Test completions after configurable keyword followed by a variable declaration", "items": [ { "label": "Thread", "kind": "TypeParameter", "detail": "Union", - "sortText": "B", + "sortText": "C", "insertText": "Thread", "insertTextFormat": "Snippet" }, @@ -20,7 +21,7 @@ "documentation": { "left": "Describes Strand execution details for the runtime.\n" }, - "sortText": "B", + "sortText": "C", "insertText": "StrandData", "insertTextFormat": "Snippet" }, @@ -334,7 +335,7 @@ "label": "map", "kind": "Unit", "detail": "type", - "sortText": "A", + "sortText": "C", "insertText": "map", "insertTextFormat": "Snippet" }, @@ -358,7 +359,7 @@ "label": "table", "kind": "Unit", "detail": "type", - "sortText": "A", + "sortText": "C", "insertText": "table", "insertTextFormat": "Snippet" }, @@ -398,7 +399,7 @@ "label": "readonly", "kind": "TypeParameter", "detail": "Readonly", - "sortText": "B", + "sortText": "C", "insertText": "readonly", "insertTextFormat": "Snippet" }, @@ -406,7 +407,7 @@ "label": "handle", "kind": "TypeParameter", "detail": "Handle", - "sortText": "B", + "sortText": "C", "insertText": "handle", "insertTextFormat": "Snippet" }, @@ -414,7 +415,7 @@ "label": "never", "kind": "TypeParameter", "detail": "Never", - "sortText": "B", + "sortText": "A", "insertText": "never", "insertTextFormat": "Snippet" }, @@ -422,7 +423,7 @@ "label": "json", "kind": "TypeParameter", "detail": "Json", - "sortText": "B", + "sortText": "A", "insertText": "json", "insertTextFormat": "Snippet" }, @@ -430,7 +431,7 @@ "label": "anydata", "kind": "TypeParameter", "detail": "Anydata", - "sortText": "B", + "sortText": "A", "insertText": "anydata", "insertTextFormat": "Snippet" }, @@ -438,7 +439,7 @@ "label": "any", "kind": "TypeParameter", "detail": "Any", - "sortText": "B", + "sortText": "C", "insertText": "any", "insertTextFormat": "Snippet" }, @@ -446,7 +447,7 @@ "label": "byte", "kind": "TypeParameter", "detail": "Byte", - "sortText": "B", + "sortText": "A", "insertText": "byte", "insertTextFormat": "Snippet" }, @@ -463,7 +464,7 @@ "label": "decimal", "kind": "TypeParameter", "detail": "Decimal", - "sortText": "B", + "sortText": "A", "insertText": "decimal", "insertTextFormat": "Snippet" }, @@ -471,7 +472,7 @@ "label": "error", "kind": "Event", "detail": "Error", - "sortText": "D", + "sortText": "C", "insertText": "error", "insertTextFormat": "Snippet" }, @@ -479,7 +480,7 @@ "label": "xml", "kind": "TypeParameter", "detail": "Xml", - "sortText": "B", + "sortText": "A", "insertText": "xml", "insertTextFormat": "Snippet" }, @@ -487,7 +488,7 @@ "label": "boolean", "kind": "TypeParameter", "detail": "Boolean", - "sortText": "B", + "sortText": "A", "insertText": "boolean", "insertTextFormat": "Snippet" }, @@ -495,7 +496,7 @@ "label": "future", "kind": "TypeParameter", "detail": "Future", - "sortText": "B", + "sortText": "C", "insertText": "future", "insertTextFormat": "Snippet" }, @@ -503,7 +504,7 @@ "label": "int", "kind": "TypeParameter", "detail": "Int", - "sortText": "B", + "sortText": "A", "insertText": "int", "insertTextFormat": "Snippet" }, @@ -511,7 +512,7 @@ "label": "float", "kind": "TypeParameter", "detail": "Float", - "sortText": "B", + "sortText": "A", "insertText": "float", "insertTextFormat": "Snippet" }, @@ -519,7 +520,7 @@ "label": "function", "kind": "TypeParameter", "detail": "Function", - "sortText": "B", + "sortText": "C", "insertText": "function", "insertTextFormat": "Snippet" }, @@ -527,7 +528,7 @@ "label": "string", "kind": "TypeParameter", "detail": "String", - "sortText": "B", + "sortText": "A", "insertText": "string", "insertTextFormat": "Snippet" }, @@ -535,7 +536,7 @@ "label": "typedesc", "kind": "TypeParameter", "detail": "Typedesc", - "sortText": "B", + "sortText": "C", "insertText": "typedesc", "insertTextFormat": "Snippet" }