diff --git a/compiler/ballerina-lang/src/main/java/io/ballerina/compiler/api/impl/BallerinaSemanticModel.java b/compiler/ballerina-lang/src/main/java/io/ballerina/compiler/api/impl/BallerinaSemanticModel.java index af3d92300d98..7ce1fc9a8d76 100644 --- a/compiler/ballerina-lang/src/main/java/io/ballerina/compiler/api/impl/BallerinaSemanticModel.java +++ b/compiler/ballerina-lang/src/main/java/io/ballerina/compiler/api/impl/BallerinaSemanticModel.java @@ -323,7 +323,8 @@ public Optional typeOf(LineRange range) { } private BType getDeterminedType(BLangNode node, LineRange range) { - if (node.getKind() == NodeKind.INVOCATION && node.getDeterminedType().getKind() == TypeKind.FUTURE) { + if (node.getKind() == NodeKind.INVOCATION && node.getDeterminedType() != null + && node.getDeterminedType().getKind() == TypeKind.FUTURE) { BLangInvocation invocationNode = (BLangInvocation) node; if (invocationNode.isAsync() && PositionUtil.withinBlock(range.startLine(), invocationNode.getName().getPosition())) { diff --git a/compiler/ballerina-lang/src/main/java/io/ballerina/projects/internal/repositories/FileSystemRepository.java b/compiler/ballerina-lang/src/main/java/io/ballerina/projects/internal/repositories/FileSystemRepository.java index e23deceb8806..ff2532a39075 100644 --- a/compiler/ballerina-lang/src/main/java/io/ballerina/projects/internal/repositories/FileSystemRepository.java +++ b/compiler/ballerina-lang/src/main/java/io/ballerina/projects/internal/repositories/FileSystemRepository.java @@ -166,7 +166,7 @@ public Map> getPackages() { } String orgName = file.getName(); File[] filesList = this.bala.resolve(orgName).toFile().listFiles(); - if (filesList == null) { + if (filesList == null || filesList.length == 0) { continue; } List pkgList = new ArrayList<>(); @@ -178,23 +178,24 @@ public Map> getPackages() { if (pkgs == null) { continue; } - String version = null; + List versions = new ArrayList<>(); for (File listFile : pkgs) { if (listFile.isHidden() || !listFile.isDirectory()) { continue; } - version = listFile.getName(); - break; + versions.add(listFile.getName()); } - if (version == null) { + if (versions.isEmpty()) { continue; } - try { - PackageVersion.from(version); - } catch (ProjectException ignored) { - continue; + for (String version : versions) { + try { + PackageVersion.from(version); + } catch (ProjectException ignored) { + continue; + } + pkgList.add(pkgDir.getName() + ":" + version); } - pkgList.add(pkgDir.getName() + ":" + version); } packagesMap.put(orgName, pkgList); } diff --git a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/BIRPackageSymbolEnter.java b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/BIRPackageSymbolEnter.java index c4c6b5e8a01b..7d61187efae4 100644 --- a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/BIRPackageSymbolEnter.java +++ b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/BIRPackageSymbolEnter.java @@ -1631,41 +1631,27 @@ public BType readType(int cpI) throws IOException { } return finiteType; case TypeTags.OBJECT: - boolean service = inputStream.readByte() == 1; - pkgCpIndex = inputStream.readInt(); pkgId = getPackageId(pkgCpIndex); String objName = getStringCPEntryValue(inputStream); - var objFlags = (inputStream.readBoolean() ? Flags.CLASS : 0) | Flags.PUBLIC; - objFlags = inputStream.readBoolean() ? objFlags | Flags.CLIENT : objFlags; + long objSymFlags = inputStream.readLong(); BObjectTypeSymbol objectSymbol; - if (Symbols.isFlagOn(objFlags, Flags.CLASS)) { - objectSymbol = Symbols.createClassSymbol(objFlags, names.fromString(objName), - env.pkgSymbol.pkgID, null, env.pkgSymbol, - symTable.builtinPos, COMPILED_SOURCE, false); + if (Symbols.isFlagOn(objSymFlags, Flags.CLASS)) { + objectSymbol = Symbols.createClassSymbol(objSymFlags, names.fromString(objName), + env.pkgSymbol.pkgID, null, env.pkgSymbol, + symTable.builtinPos, COMPILED_SOURCE, false); } else { - objectSymbol = Symbols.createObjectSymbol(objFlags, names.fromString(objName), - env.pkgSymbol.pkgID, null, env.pkgSymbol, - symTable.builtinPos, COMPILED_SOURCE); + objectSymbol = Symbols.createObjectSymbol(objSymFlags, names.fromString(objName), + env.pkgSymbol.pkgID, null, env.pkgSymbol, + symTable.builtinPos, COMPILED_SOURCE); } objectSymbol.scope = new Scope(objectSymbol); BObjectType objectType; // Below is a temporary fix, need to fix this properly by using the type tag objectType = new BObjectType(objectSymbol); - - if (service) { - objectType.flags |= Flags.SERVICE; - objectSymbol.flags |= Flags.SERVICE; - } - if (isImmutable(flags)) { - objectSymbol.flags |= Flags.READONLY; - } - if (Symbols.isFlagOn(flags, Flags.ANONYMOUS)) { - objectSymbol.flags |= Flags.ANONYMOUS; - } objectType.flags = flags; objectSymbol.type = objectType; addShapeCP(objectType, cpI); diff --git a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/BIRGen.java b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/BIRGen.java index 910a9d394177..210a91289baa 100644 --- a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/BIRGen.java +++ b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/BIRGen.java @@ -1542,6 +1542,7 @@ public void visit(BLangLiteral astLiteralExpr) { @Override public void visit(BLangMapLiteral astMapLiteralExpr) { + this.env.isInArrayOrStructure++; visitTypedesc(astMapLiteralExpr.pos, astMapLiteralExpr.getBType(), Collections.emptyList()); BIRVariableDcl tempVarDcl = new BIRVariableDcl(astMapLiteralExpr.getBType(), this.env.nextLocalVarId(names), @@ -1552,6 +1553,7 @@ public void visit(BLangMapLiteral astMapLiteralExpr) { setScopeAndEmit(new BIRNonTerminator.NewStructure(astMapLiteralExpr.pos, toVarRef, this.env.targetOperand, generateMappingConstructorEntries(astMapLiteralExpr.fields))); this.env.targetOperand = toVarRef; + this.env.isInArrayOrStructure--; } @Override @@ -1572,6 +1574,7 @@ public void visit(BLangTypeConversionExpr astTypeConversionExpr) { @Override public void visit(BLangStructLiteral astStructLiteralExpr) { + this.env.isInArrayOrStructure++; List varDcls = mapToVarDcls(astStructLiteralExpr.enclMapSymbols); BType type = astStructLiteralExpr.getBType(); visitTypedesc(astStructLiteralExpr.pos, type, varDcls); @@ -1588,6 +1591,7 @@ public void visit(BLangStructLiteral astStructLiteralExpr) { setScopeAndEmit(instruction); this.env.targetOperand = toVarRef; + this.env.isInArrayOrStructure--; } private List mapToVarDcls(TreeMap enclMapSymbols) { @@ -1838,14 +1842,17 @@ public void visit(BLangPackageVarRef astPackageVarRefExpr) { setScopeAndEmit(new Move(astPackageVarRefExpr.pos, this.env.targetOperand, varRef)); } } else { - BIRVariableDcl tempVarDcl = new BIRVariableDcl(astPackageVarRefExpr.getBType(), - this.env.nextLocalVarId(names), VarScope.FUNCTION, - VarKind.TEMP); - this.env.enclFunc.localVars.add(tempVarDcl); - BIROperand tempVarRef = new BIROperand(tempVarDcl); - BIROperand fromVarRef = new BIROperand(getVarRef(astPackageVarRefExpr)); - setScopeAndEmit(new Move(astPackageVarRefExpr.pos, fromVarRef, tempVarRef)); - this.env.targetOperand = tempVarRef; + if (this.env.isInArrayOrStructure > 0) { + BIRVariableDcl tempVarDcl = new BIRVariableDcl(astPackageVarRefExpr.getBType(), + this.env.nextLocalVarId(names), VarScope.FUNCTION, VarKind.TEMP); + this.env.enclFunc.localVars.add(tempVarDcl); + BIROperand tempVarRef = new BIROperand(tempVarDcl); + BIROperand fromVarRef = new BIROperand(getVarRef(astPackageVarRefExpr)); + setScopeAndEmit(new Move(astPackageVarRefExpr.pos, fromVarRef, tempVarRef)); + this.env.targetOperand = tempVarRef; + } else { + this.env.targetOperand = new BIROperand(getVarRef(astPackageVarRefExpr)); + } } this.varAssignment = variableStore; } @@ -1942,6 +1949,7 @@ public void visit(BLangWaitExpr waitExpr) { @Override public void visit(BLangWaitForAllExpr.BLangWaitLiteral waitLiteral) { + this.env.isInArrayOrStructure++; visitTypedesc(waitLiteral.pos, waitLiteral.getBType(), Collections.emptyList()); BIRBasicBlock thenBB = new BIRBasicBlock(this.env.nextBBId()); addToTrapStack(thenBB); @@ -1966,6 +1974,7 @@ public void visit(BLangWaitForAllExpr.BLangWaitLiteral waitLiteral) { this.env.targetOperand = toVarRef; this.env.enclFunc.basicBlocks.add(thenBB); this.env.enclBB = thenBB; + this.env.isInArrayOrStructure--; } @Override @@ -2646,6 +2655,7 @@ private InstructionKind getUnaryInstructionKind(OperatorKind opKind) { } private void generateListConstructorExpr(BLangListConstructorExpr listConstructorExpr) { + this.env.isInArrayOrStructure++; // Emit create array instruction BIRVariableDcl tempVarDcl = new BIRVariableDcl(listConstructorExpr.getBType(), this.env.nextLocalVarId(names), VarScope.FUNCTION, VarKind.TEMP); @@ -2695,6 +2705,7 @@ private void generateListConstructorExpr(BLangListConstructorExpr listConstructo initialValues)); } this.env.targetOperand = toVarRef; + this.env.isInArrayOrStructure--; } private void generateArrayAccess(BLangIndexBasedAccess astArrayAccessExpr) { diff --git a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/BIRGenEnv.java b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/BIRGenEnv.java index 03beb1cb2415..2ddf4a1b69c5 100644 --- a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/BIRGenEnv.java +++ b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/BIRGenEnv.java @@ -73,6 +73,9 @@ class BIRGenEnv { // A function can have only one basic block that has a return instruction. BIRBasicBlock returnBB; + // This is to hold whether a NewArray or NewStructure instruction is being constructed + int isInArrayOrStructure = 0; + BIRGenEnv(BIRPackage birPkg) { this.enclPkg = birPkg; } diff --git a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/codegen/JvmCastGen.java b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/codegen/JvmCastGen.java index 7e38f4fa3c5e..78b1cbfd58a1 100644 --- a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/codegen/JvmCastGen.java +++ b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/codegen/JvmCastGen.java @@ -94,7 +94,7 @@ import static org.wso2.ballerinalang.compiler.bir.codegen.JvmConstants.SIMPLE_VALUE; import static org.wso2.ballerinalang.compiler.bir.codegen.JvmConstants.STREAM_VALUE; import static org.wso2.ballerinalang.compiler.bir.codegen.JvmConstants.STRING_VALUE; -import static org.wso2.ballerinalang.compiler.bir.codegen.JvmConstants.TABLE_VALUE_IMPL; +import static org.wso2.ballerinalang.compiler.bir.codegen.JvmConstants.TABLE_VALUE; import static org.wso2.ballerinalang.compiler.bir.codegen.JvmConstants.TYPEDESC_VALUE; import static org.wso2.ballerinalang.compiler.bir.codegen.JvmConstants.TYPE_CHECKER; import static org.wso2.ballerinalang.compiler.bir.codegen.JvmConstants.TYPE_CONVERTER; @@ -1361,7 +1361,7 @@ static String getTargetClass(BType targetType) { targetTypeClass = MAP_VALUE; break; case TypeTags.TABLE: - targetTypeClass = TABLE_VALUE_IMPL; + targetTypeClass = TABLE_VALUE; break; case TypeTags.STREAM: targetTypeClass = STREAM_VALUE; diff --git a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/codegen/JvmCodeGenUtil.java b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/codegen/JvmCodeGenUtil.java index 348e077b588c..7f8d0a9edcfa 100644 --- a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/codegen/JvmCodeGenUtil.java +++ b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/codegen/JvmCodeGenUtil.java @@ -122,7 +122,7 @@ import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.GET_RUNTIME; import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.GET_STRAND_METADATA; import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.GET_STREAM_VALUE; -import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.GET_TABLE_VALUE_IMPL; +import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.GET_TABLE_VALUE; import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.GET_TYPEDESC; import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.GET_XML; import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.HANDLE_DESCRIPTOR_FOR_STRING_CONCAT; @@ -144,7 +144,7 @@ import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.RETURN_MAP_VALUE; import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.RETURN_REGEX_VALUE; import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.RETURN_STREAM_VALUE; -import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.RETURN_TABLE_VALUE_IMPL; +import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.RETURN_TABLE_VALUE; import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.RETURN_TYPEDESC_VALUE; import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.RETURN_XML_VALUE; import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.STRING_BUILDER_APPEND; @@ -243,7 +243,7 @@ public static String getFieldTypeSignature(BType bType) { case TypeTags.STREAM: return GET_STREAM_VALUE; case TypeTags.TABLE: - return GET_TABLE_VALUE_IMPL; + return GET_TABLE_VALUE; case TypeTags.ARRAY: case TypeTags.TUPLE: return GET_ARRAY_VALUE; @@ -434,7 +434,7 @@ public static String getArgTypeSignature(BType bType) { case TypeTags.STREAM: return GET_STREAM_VALUE; case TypeTags.TABLE: - return GET_TABLE_VALUE_IMPL; + return GET_TABLE_VALUE; case TypeTags.INVOKABLE: return GET_FUNCTION_POINTER; case TypeTags.TYPEDESC: @@ -489,7 +489,7 @@ public static String generateReturnType(BType bType) { case TypeTags.STREAM: return RETURN_STREAM_VALUE; case TypeTags.TABLE: - return RETURN_TABLE_VALUE_IMPL; + return RETURN_TABLE_VALUE; case TypeTags.FUTURE: return RETURN_FUTURE_VALUE; case TypeTags.TYPEDESC: diff --git a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/codegen/JvmSignatures.java b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/codegen/JvmSignatures.java index d2968e8cbe49..340615545b3f 100644 --- a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/codegen/JvmSignatures.java +++ b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/codegen/JvmSignatures.java @@ -110,7 +110,6 @@ import static org.wso2.ballerinalang.compiler.bir.codegen.JvmConstants.STRING_TYPE; import static org.wso2.ballerinalang.compiler.bir.codegen.JvmConstants.STRING_VALUE; import static org.wso2.ballerinalang.compiler.bir.codegen.JvmConstants.TABLE_VALUE; -import static org.wso2.ballerinalang.compiler.bir.codegen.JvmConstants.TABLE_VALUE_IMPL; import static org.wso2.ballerinalang.compiler.bir.codegen.JvmConstants.THROWABLE; import static org.wso2.ballerinalang.compiler.bir.codegen.JvmConstants.TOML_DETAILS; import static org.wso2.ballerinalang.compiler.bir.codegen.JvmConstants.TRANSACTION_CONTEXT_CLASS; @@ -253,7 +252,7 @@ public class JvmSignatures { public static final String GET_STRING = "L" + STRING_VALUE + ";"; public static final String GET_STRING_AT = "(L" + B_STRING_VALUE + ";J)L" + B_STRING_VALUE + ";"; public static final String GET_STRING_FROM_ARRAY = "(J)L" + OBJECT + ";"; - public static final String GET_TABLE_VALUE_IMPL = "L" + TABLE_VALUE_IMPL + ";"; + public static final String GET_TABLE_VALUE = "L" + TABLE_VALUE + ";"; public static final String GET_THROWABLE = "L" + THROWABLE + ";"; public static final String GET_TUPLE_TYPE_IMPL = "L" + TUPLE_TYPE_IMPL + ";"; public static final String GET_TYPE = "L" + TYPE + ";"; @@ -418,7 +417,7 @@ public class JvmSignatures { public static final String RETURN_MAP_VALUE = ")L" + MAP_VALUE + ";"; public static final String RETURN_OBJECT = "()L" + OBJECT + ";"; public static final String RETURN_STREAM_VALUE = ")L" + STREAM_VALUE + ";"; - public static final String RETURN_TABLE_VALUE_IMPL = ")L" + TABLE_VALUE_IMPL + ";"; + public static final String RETURN_TABLE_VALUE = ")L" + TABLE_VALUE + ";"; public static final String RETURN_TYPEDESC_VALUE = ")L" + TYPEDESC_VALUE + ";"; public static final String RETURN_XML_VALUE = ")L" + XML_VALUE + ";"; public static final String SCHEDULE_LOCAL = "([L" + OBJECT + ";L" + B_FUNCTION_POINTER + ";L" + diff --git a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/codegen/JvmTypeGen.java b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/codegen/JvmTypeGen.java index 8853854d17fa..6d61f3b0e92c 100644 --- a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/codegen/JvmTypeGen.java +++ b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/codegen/JvmTypeGen.java @@ -144,7 +144,7 @@ import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.GET_OBJECT; import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.GET_REGEXP; import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.GET_STREAM_VALUE; -import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.GET_TABLE_VALUE_IMPL; +import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.GET_TABLE_VALUE; import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.GET_TYPE; import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.GET_TYPEDESC; import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.GET_TYPE_REF_TYPE_IMPL; @@ -985,7 +985,8 @@ private void populateFunctionParameters(MethodVisitor mv, BInvokableTypeSymbol i } else { mv.visitInsn(ICONST_0); } - BInvokableSymbol bInvokableSymbol = invokableSymbol.defaultValues.get(paramSymbol.originalName.value); + BInvokableSymbol bInvokableSymbol = invokableSymbol.defaultValues.get( + Utils.decodeIdentifier(paramSymbol.name.value)); if (bInvokableSymbol == null) { mv.visitInsn(ACONST_NULL); } else { @@ -1086,7 +1087,7 @@ public static String getTypeDesc(BType bType) { case TypeTags.STREAM: return GET_STREAM_VALUE; case TypeTags.TABLE: - return GET_TABLE_VALUE_IMPL; + return GET_TABLE_VALUE; case TypeTags.DECIMAL: return GET_BDECIMAL; case TypeTags.OBJECT: diff --git a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/codegen/methodgen/MethodGen.java b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/codegen/methodgen/MethodGen.java index 71bb4438b6e1..c090b1c360a2 100644 --- a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/codegen/methodgen/MethodGen.java +++ b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/codegen/methodgen/MethodGen.java @@ -132,7 +132,7 @@ import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.GET_STRAND; import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.GET_STREAM_VALUE; import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.GET_STRING; -import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.GET_TABLE_VALUE_IMPL; +import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.GET_TABLE_VALUE; import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.GET_TYPEDESC; import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.GET_XML; import static org.wso2.ballerinalang.compiler.bir.codegen.JvmSignatures.INITIAL_METHOD_DESC; @@ -716,8 +716,7 @@ private void generateFrameClassFieldLoadByTypeTag(MethodVisitor mv, String frame mv.visitVarInsn(DSTORE, index); break; case TypeTags.DECIMAL: - mv.visitFieldInsn(GETFIELD, frameName, localVar.jvmVarName, - GET_BDECIMAL); + mv.visitFieldInsn(GETFIELD, frameName, localVar.jvmVarName, GET_BDECIMAL); mv.visitVarInsn(ASTORE, index); break; case TypeTags.BOOLEAN: @@ -726,49 +725,40 @@ private void generateFrameClassFieldLoadByTypeTag(MethodVisitor mv, String frame break; case TypeTags.MAP: case TypeTags.RECORD: - mv.visitFieldInsn(GETFIELD, frameName, localVar.jvmVarName, - GET_MAP_VALUE); + mv.visitFieldInsn(GETFIELD, frameName, localVar.jvmVarName, GET_MAP_VALUE); mv.visitVarInsn(ASTORE, index); break; case TypeTags.STREAM: - mv.visitFieldInsn(GETFIELD, frameName, localVar.jvmVarName, - GET_STREAM_VALUE); + mv.visitFieldInsn(GETFIELD, frameName, localVar.jvmVarName, GET_STREAM_VALUE); mv.visitVarInsn(ASTORE, index); break; case TypeTags.TABLE: - mv.visitFieldInsn(GETFIELD, frameName, localVar.jvmVarName, - GET_TABLE_VALUE_IMPL); + mv.visitFieldInsn(GETFIELD, frameName, localVar.jvmVarName, GET_TABLE_VALUE); mv.visitVarInsn(ASTORE, index); break; case TypeTags.ARRAY: case TypeTags.TUPLE: - mv.visitFieldInsn(GETFIELD, frameName, localVar.jvmVarName, - GET_ARRAY_VALUE); + mv.visitFieldInsn(GETFIELD, frameName, localVar.jvmVarName, GET_ARRAY_VALUE); mv.visitVarInsn(ASTORE, index); break; case TypeTags.OBJECT: - mv.visitFieldInsn(GETFIELD, frameName, localVar.jvmVarName, - GET_BOBJECT); + mv.visitFieldInsn(GETFIELD, frameName, localVar.jvmVarName, GET_BOBJECT); mv.visitVarInsn(ASTORE, index); break; case TypeTags.ERROR: - mv.visitFieldInsn(GETFIELD, frameName, localVar.jvmVarName, - GET_ERROR_VALUE); + mv.visitFieldInsn(GETFIELD, frameName, localVar.jvmVarName, GET_ERROR_VALUE); mv.visitVarInsn(ASTORE, index); break; case TypeTags.FUTURE: - mv.visitFieldInsn(GETFIELD, frameName, localVar.jvmVarName, - GET_FUTURE_VALUE); + mv.visitFieldInsn(GETFIELD, frameName, localVar.jvmVarName, GET_FUTURE_VALUE); mv.visitVarInsn(ASTORE, index); break; case TypeTags.INVOKABLE: - mv.visitFieldInsn(GETFIELD, frameName, localVar.jvmVarName, - GET_FUNCTION_POINTER); + mv.visitFieldInsn(GETFIELD, frameName, localVar.jvmVarName, GET_FUNCTION_POINTER); mv.visitVarInsn(ASTORE, index); break; case TypeTags.TYPEDESC: - mv.visitFieldInsn(GETFIELD, frameName, localVar.jvmVarName, - GET_TYPEDESC); + mv.visitFieldInsn(GETFIELD, frameName, localVar.jvmVarName, GET_TYPEDESC); mv.visitVarInsn(ASTORE, index); break; case TypeTags.NIL: @@ -780,13 +770,11 @@ private void generateFrameClassFieldLoadByTypeTag(MethodVisitor mv, String frame case TypeTags.JSON: case TypeTags.FINITE: case TypeTags.READONLY: - mv.visitFieldInsn(GETFIELD, frameName, localVar.jvmVarName, - GET_OBJECT); + mv.visitFieldInsn(GETFIELD, frameName, localVar.jvmVarName, GET_OBJECT); mv.visitVarInsn(ASTORE, index); break; case TypeTags.HANDLE: - mv.visitFieldInsn(GETFIELD, frameName, localVar.jvmVarName, - GET_HANDLE_VALUE); + mv.visitFieldInsn(GETFIELD, frameName, localVar.jvmVarName, GET_HANDLE_VALUE); mv.visitVarInsn(ASTORE, index); break; case JTypeTags.JTYPE: @@ -856,16 +844,13 @@ private void generateFrameClassFieldUpdate(List localVars, Metho mv.visitFieldInsn(PUTFIELD, frameName, localVar.jvmVarName, "J"); } else if (TypeTags.isStringTypeTag(bType.tag)) { mv.visitVarInsn(ALOAD, index); - mv.visitFieldInsn(PUTFIELD, frameName, localVar.jvmVarName, - GET_BSTRING); + mv.visitFieldInsn(PUTFIELD, frameName, localVar.jvmVarName, GET_BSTRING); } else if (TypeTags.isXMLTypeTag(bType.tag)) { mv.visitVarInsn(ALOAD, index); - mv.visitFieldInsn(PUTFIELD, frameName, localVar.jvmVarName, - GET_XML); + mv.visitFieldInsn(PUTFIELD, frameName, localVar.jvmVarName, GET_XML); } else if (TypeTags.REGEXP == bType.tag) { mv.visitVarInsn(ALOAD, index); - mv.visitFieldInsn(PUTFIELD, frameName, localVar.jvmVarName, - GET_REGEXP); + mv.visitFieldInsn(PUTFIELD, frameName, localVar.jvmVarName, GET_REGEXP); } else { generateFrameClassFieldUpdateByTypeTag(mv, frameName, localVar, index, bType); } @@ -895,50 +880,41 @@ private void generateFrameClassFieldUpdateByTypeTag(MethodVisitor mv, String fra case TypeTags.MAP: case TypeTags.RECORD: mv.visitVarInsn(ALOAD, index); - mv.visitFieldInsn(PUTFIELD, frameName, localVar.jvmVarName, - GET_MAP_VALUE); + mv.visitFieldInsn(PUTFIELD, frameName, localVar.jvmVarName, GET_MAP_VALUE); break; case TypeTags.STREAM: mv.visitVarInsn(ALOAD, index); - mv.visitFieldInsn(PUTFIELD, frameName, localVar.jvmVarName, - GET_STREAM_VALUE); + mv.visitFieldInsn(PUTFIELD, frameName, localVar.jvmVarName, GET_STREAM_VALUE); break; case TypeTags.TABLE: mv.visitVarInsn(ALOAD, index); - mv.visitFieldInsn(PUTFIELD, frameName, localVar.jvmVarName, - GET_TABLE_VALUE_IMPL); + mv.visitFieldInsn(PUTFIELD, frameName, localVar.jvmVarName, GET_TABLE_VALUE); break; case TypeTags.ARRAY: case TypeTags.TUPLE: mv.visitVarInsn(ALOAD, index); - mv.visitFieldInsn(PUTFIELD, frameName, localVar.jvmVarName, - GET_ARRAY_VALUE); + mv.visitFieldInsn(PUTFIELD, frameName, localVar.jvmVarName, GET_ARRAY_VALUE); break; case TypeTags.ERROR: mv.visitVarInsn(ALOAD, index); - mv.visitFieldInsn(PUTFIELD, frameName, localVar.jvmVarName, - GET_ERROR_VALUE); + mv.visitFieldInsn(PUTFIELD, frameName, localVar.jvmVarName, GET_ERROR_VALUE); break; case TypeTags.FUTURE: mv.visitVarInsn(ALOAD, index); - mv.visitFieldInsn(PUTFIELD, frameName, localVar.jvmVarName, - GET_FUTURE_VALUE); + mv.visitFieldInsn(PUTFIELD, frameName, localVar.jvmVarName, GET_FUTURE_VALUE); break; case TypeTags.TYPEDESC: mv.visitVarInsn(ALOAD, index); mv.visitTypeInsn(CHECKCAST, TYPEDESC_VALUE); - mv.visitFieldInsn(PUTFIELD, frameName, localVar.jvmVarName, - GET_TYPEDESC); + mv.visitFieldInsn(PUTFIELD, frameName, localVar.jvmVarName, GET_TYPEDESC); break; case TypeTags.OBJECT: mv.visitVarInsn(ALOAD, index); - mv.visitFieldInsn(PUTFIELD, frameName, localVar.jvmVarName, - GET_BOBJECT); + mv.visitFieldInsn(PUTFIELD, frameName, localVar.jvmVarName, GET_BOBJECT); break; case TypeTags.INVOKABLE: mv.visitVarInsn(ALOAD, index); - mv.visitFieldInsn(PUTFIELD, frameName, localVar.jvmVarName, - GET_FUNCTION_POINTER); + mv.visitFieldInsn(PUTFIELD, frameName, localVar.jvmVarName, GET_FUNCTION_POINTER); break; case TypeTags.NIL: case TypeTags.NEVER: @@ -950,13 +926,11 @@ private void generateFrameClassFieldUpdateByTypeTag(MethodVisitor mv, String fra case TypeTags.FINITE: case TypeTags.READONLY: mv.visitVarInsn(ALOAD, index); - mv.visitFieldInsn(PUTFIELD, frameName, localVar.jvmVarName, - GET_OBJECT); + mv.visitFieldInsn(PUTFIELD, frameName, localVar.jvmVarName, GET_OBJECT); break; case TypeTags.HANDLE: mv.visitVarInsn(ALOAD, index); - mv.visitFieldInsn(PUTFIELD, frameName, localVar.jvmVarName, - GET_HANDLE_VALUE); + mv.visitFieldInsn(PUTFIELD, frameName, localVar.jvmVarName, GET_HANDLE_VALUE); break; case JTypeTags.JTYPE: generateFrameClassJFieldUpdate(localVar, mv, index, frameName); @@ -966,8 +940,7 @@ private void generateFrameClassFieldUpdateByTypeTag(MethodVisitor mv, String fra ((BTypeReferenceType) bType).referredType); break; default: - throw new BLangCompilerException(JvmConstants.TYPE_NOT_SUPPORTED_MESSAGE + - bType); + throw new BLangCompilerException(JvmConstants.TYPE_NOT_SUPPORTED_MESSAGE + bType); } } @@ -1122,7 +1095,7 @@ private String getJVMTypeSign(BType bType) { jvmType = GET_STREAM_VALUE; break; case TypeTags.TABLE: - jvmType = GET_TABLE_VALUE_IMPL; + jvmType = GET_TABLE_VALUE; break; case TypeTags.ARRAY: case TypeTags.TUPLE: diff --git a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/optimizer/BIROptimizer.java b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/optimizer/BIROptimizer.java index edc137bd9bc8..d06c0300edf1 100644 --- a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/optimizer/BIROptimizer.java +++ b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/optimizer/BIROptimizer.java @@ -34,6 +34,7 @@ import org.wso2.ballerinalang.compiler.bir.model.VarKind; import org.wso2.ballerinalang.compiler.semantics.model.types.BType; import org.wso2.ballerinalang.compiler.util.CompilerContext; +import org.wso2.ballerinalang.compiler.util.TypeTags; import org.wso2.ballerinalang.util.Lists; import java.util.ArrayList; @@ -475,11 +476,31 @@ public void visit(BIRNonTerminator.Move birMove) { this.env.newInstructions.add(birMove); return; } + if (isIrreplaceableVar(birMove.rhsOp.variableDcl)) { + this.env.newInstructions.add(birMove); + this.env.irreplaceableTempVars.add(birMove.lhsOp.variableDcl); + return; + } if (birMove.rhsOp.variableDcl.kind != VarKind.TEMP) { this.env.tempVars.put(birMove.lhsOp.variableDcl, birMove.rhsOp.variableDcl); } } + private boolean isIrreplaceableVar(BIRVariableDcl variableDcl) { + if (variableDcl.kind != VarKind.GLOBAL) { + return false; + } + int typeTag = variableDcl.type.tag; + switch (typeTag) { + case TypeTags.BYTE: + case TypeTags.BOOLEAN: + case TypeTags.FLOAT: + return true; + default: + return TypeTags.isIntegerTypeTag(typeTag); + } + } + @Override public void visit(BIRNonTerminator.BinaryOp birBinaryOp) { this.optimizeNode(birBinaryOp.lhsOp, this.env); @@ -741,6 +762,8 @@ public static class OptimizerEnv { // key - temp var, value - real var private final Map tempVars = new HashMap<>(); + private final Set irreplaceableTempVars = new HashSet<>(); + private List newInstructions; private final List tempVarsList = new ArrayList<>(); @@ -757,7 +780,7 @@ public static class OptimizerEnv { public void addTempBirOperand(BIROperand birOperand) { BIRVariableDcl variableDcl = birOperand.variableDcl; - if (variableDcl.kind != VarKind.TEMP) { + if (variableDcl.kind != VarKind.TEMP || irreplaceableTempVars.contains(variableDcl)) { return; } tempVarsList.add(birOperand); diff --git a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/optimizer/ControlFlowGraph.java b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/optimizer/ControlFlowGraph.java deleted file mode 100644 index 2abe6b1dd805..000000000000 --- a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/optimizer/ControlFlowGraph.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright (c) 2020, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you under the Apache License, - * Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.wso2.ballerinalang.compiler.bir.optimizer; - -import org.wso2.ballerinalang.compiler.bir.model.BIRAbstractInstruction; -import org.wso2.ballerinalang.compiler.bir.model.BIRNode; -import org.wso2.ballerinalang.compiler.bir.model.BIRTerminator; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * The control flow graph that gets created from the bir. In this implementation each instruction is reflected as a node - * in the Graph including the terminator instruction. - */ -public class ControlFlowGraph { - private final BIRNode.BIRFunction function; - private final Map funcBasicBlockFirstNodeMap; - private final Map funcBasicBlockLastNodeMap; - private final List nodes; - - public ControlFlowGraph(BIRNode.BIRFunction function) { - this.function = function; - funcBasicBlockFirstNodeMap = new HashMap<>(); - funcBasicBlockLastNodeMap = new HashMap<>(); - nodes = new ArrayList<>(); - generate(); - } - - /** - * Traverses the BIR and generates a graph. Each instruction is represented as a Node and linked with an edge to the - * next instruction within the same basic block. The nodes across the basic blocks are linked based on the basic - * blocks' terminator nodes. - */ - public void generate() { - for (BIRNode.BIRBasicBlock basicBlock : function.basicBlocks) { - Node prev = null; - for (int i = 0; i < basicBlock.instructions.size(); i++) { - Node node = new Node(basicBlock.instructions.get(i)); - nodes.add(node); - if (i == 0) { - funcBasicBlockFirstNodeMap.put(basicBlock, node); - } - if (prev != null) { - addEdge(prev, node); - } - prev = node; - } - Node terminatorNode = new Node(basicBlock.terminator); - nodes.add(terminatorNode); - if (prev != null) { - addEdge(prev, terminatorNode); - } else { - funcBasicBlockFirstNodeMap.put(basicBlock, terminatorNode); - } - funcBasicBlockLastNodeMap.put(basicBlock, terminatorNode); - } - - connectNodesAcrossBasicBlocks(); - } - - private void connectNodesAcrossBasicBlocks() { - funcBasicBlockLastNodeMap.forEach((birBasicBlock, node) -> { - BIRTerminator terminator = birBasicBlock.terminator; - for (BIRNode.BIRBasicBlock basicBlock : terminator.getNextBasicBlocks()) { - Node target = funcBasicBlockFirstNodeMap.get(basicBlock); - if (target != null) { - addEdge(node, target); - } - } - }); - } - - private void addEdge(Node first, Node second) { - first.successors.add(second); - second.predecessors.add(first); - } - - public List getNodes() { - return nodes; - } - - static class Node { - List successors; - List predecessors; - BIRAbstractInstruction instruction; - - public Node(BIRAbstractInstruction instruction) { - this.instruction = instruction; - predecessors = new ArrayList<>(); - successors = new ArrayList<>(); - } - } -} diff --git a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/optimizer/LivenessAnalyzer.java b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/optimizer/LivenessAnalyzer.java deleted file mode 100644 index 4acb74c9a10f..000000000000 --- a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/optimizer/LivenessAnalyzer.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright (c) 2020, WSO2 Inc. (http://www.wso2.org) All Rights Reserved. - * - * WSO2 Inc. licenses this file to you under the Apache License, - * Version 2.0 (the "License"); you may not use this file except - * in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -package org.wso2.ballerinalang.compiler.bir.optimizer; - -import org.wso2.ballerinalang.compiler.bir.model.BIRAbstractInstruction; -import org.wso2.ballerinalang.compiler.bir.model.BIRNode; -import org.wso2.ballerinalang.compiler.bir.model.BIROperand; -import org.wso2.ballerinalang.compiler.bir.model.VarKind; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -/** - * Do liveness analysis on the control flow graph to obtain the liveOut value of each function. - *

- * Reference: Andrew W. Appel - Modern Compiler Implementation in Java, 2Ed (2002), Chapter 10 - */ -public class LivenessAnalyzer { - private final Map> liveIns; - private final Map> liveOuts; - private final List nodes; - - public LivenessAnalyzer(List nodes) { - this.liveIns = new HashMap<>(); - this.liveOuts = new HashMap<>(); - this.nodes = nodes; - init(); - } - - private void init() { - nodes.forEach(node -> { - liveIns.put(node, new HashSet<>()); - liveOuts.put(node, new HashSet<>()); - }); - analyze(); - } - - /** - * Analyzes the CFG based on the following equation till there's no change in the liveIns and liveOuts. - * - *

- * in[n] ← use[n] ∪ (out[n] − def [n]) - *

- * out[n] ← ∪(s∈succ[n]) (in[s]) - *

- * where ∪ indicates union of, in is liveIns, out is liveOuts, def is lhsOp and use is rhs operands. - */ - private void analyze() { - if (nodes.isEmpty()) { - return; - } - boolean changed = true; - while (changed) { - changed = false; - for (int i = nodes.size() - 1; i >= 0; i--) { - ControlFlowGraph.Node node = nodes.get(i); - changed |= updateLiveIns(node); - changed |= updateLiveOuts(node); - } - } - } - - /** - * If an operand is used at the current node or is liveOut at the current node, it is liveIn at the current node. - * This is except for the operand defined at the current node. - * - * @param node the current node - * @return whether the set changed - */ - private boolean updateLiveIns(ControlFlowGraph.Node node) { - boolean changed = false; - Set in = liveIns.get(node); - Set out = liveOuts.get(node); - for (BIROperand use : node.instruction.getRhsOperands()) { - changed |= in.add(use.variableDcl); - } - BIRNode.BIRVariableDcl def = getDef(node); - boolean removed = out.remove(def); - changed |= in.addAll(out); - if (removed) { - out.add(def); - } - return changed; - } - - private BIRNode.BIRVariableDcl getDef(ControlFlowGraph.Node node) { - BIRNode.BIRVariableDcl def = null; - if (node.instruction.lhsOp != null) { - BIRNode.BIRVariableDcl variableDcl = node.instruction.lhsOp.variableDcl; - if (variableDcl.kind != VarKind.GLOBAL) { - def = variableDcl; - } - } - return def; - } - - /** - * If an operand is liveIn at any of the successors it is liveOut at current node. - * - * @param node the current node - * @return whether the set changed - */ - private boolean updateLiveOuts(ControlFlowGraph.Node node) { - boolean changed = false; - for (ControlFlowGraph.Node successor : node.successors) { - changed |= liveOuts.get(node).addAll(liveIns.get(successor)); - } - return changed; - } - - /** - * Get the set of variables that are live after the execution of an instruction. - * - * @return map of BIRAbstractInstruction and the set of variables that are live after the execution of the - * instruction. - */ - public Map> getInstructionLiveOuts() { - Map> map = new HashMap<>(); - liveOuts.forEach((node, var) -> map.put(node.instruction, var)); - return map; - } -} diff --git a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/writer/BIRTypeWriter.java b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/writer/BIRTypeWriter.java index 9d1ecec805ec..145f78a476cd 100644 --- a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/writer/BIRTypeWriter.java +++ b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/bir/writer/BIRTypeWriter.java @@ -439,14 +439,6 @@ public void visit(BRecordType bRecordType) { @Override public void visit(BObjectType bObjectType) { - //This is to say this is an object, this is a temporary fix object - 1, service - 0, - // ideal fix would be to use the type tag to - // differentiate. TODO fix later - if ((bObjectType.flags & Flags.SERVICE) == Flags.SERVICE) { - buff.writeByte(1); - } else { - buff.writeByte(0); - } writeObjectAndServiceTypes(bObjectType); writeTypeIds(bObjectType.typeIdSet); } @@ -460,9 +452,7 @@ private void writeObjectAndServiceTypes(BObjectType bObjectType) { BTypeDefinitionSymbol typDefSymbol = ((BObjectTypeSymbol) tSymbol).typeDefinitionSymbol; buff.writeInt(addStringCPEntry(Objects.requireNonNullElse(typDefSymbol, tSymbol).name.value)); - //TODO below two line are a temp solution, introduce a generic concept - buff.writeBoolean(Symbols.isFlagOn(tSymbol.flags, Flags.CLASS)); // Abstract object or not - buff.writeBoolean(Symbols.isFlagOn(tSymbol.flags, Flags.CLIENT)); + buff.writeLong(tSymbol.flags); buff.writeInt(bObjectType.fields.size()); for (BField field : bObjectType.fields.values()) { buff.writeInt(addStringCPEntry(field.name.value)); diff --git a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/desugar/ClosureGenerator.java b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/desugar/ClosureGenerator.java index e6ff7fd6307e..0258d331b5ba 100644 --- a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/desugar/ClosureGenerator.java +++ b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/desugar/ClosureGenerator.java @@ -17,6 +17,7 @@ */ package org.wso2.ballerinalang.compiler.desugar; +import io.ballerina.identifier.Utils; import io.ballerina.tools.diagnostics.Location; import org.ballerinalang.model.TreeBuilder; import org.ballerinalang.model.elements.Flag; @@ -555,7 +556,7 @@ private BLangExpression createClosureForDefaultValue(String closureName, String env.enclPkg.symbol.scope.define(function.symbol.name, function.symbol); env.enclPkg.functions.add(function); env.enclPkg.topLevelNodes.add(function); - symbol.defaultValues.put(paramName, varSymbol); + symbol.defaultValues.put(Utils.unescapeBallerina(paramName), varSymbol); return returnStmt.expr; } diff --git a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/desugar/Desugar.java b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/desugar/Desugar.java index 5106ec89ec84..e02b7df1b9e7 100644 --- a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/desugar/Desugar.java +++ b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/desugar/Desugar.java @@ -17,6 +17,7 @@ */ package org.wso2.ballerinalang.compiler.desugar; +import io.ballerina.identifier.Utils; import io.ballerina.runtime.api.constants.RuntimeConstants; import io.ballerina.tools.diagnostics.Location; import org.apache.commons.lang3.StringEscapeUtils; @@ -780,8 +781,9 @@ public void visit(BLangPackage pkgNode) { annotationDesugar.initializeAnnotationMap(pkgNode); pkgNode.constants.stream() - .filter(constant -> constant.expr.getKind() == NodeKind.LITERAL || + .filter(constant -> (constant.expr.getKind() == NodeKind.LITERAL || constant.expr.getKind() == NodeKind.NUMERIC_LITERAL) + && constant.expr.getBType().tag != TypeTags.TUPLE) .forEach(constant -> pkgNode.typeDefinitions.add(constant.associatedTypeDefinition)); BLangBlockStmt serviceAttachments = serviceDesugar.rewriteServiceVariables(pkgNode.services, env); @@ -5793,7 +5795,8 @@ public void visit(BLangForkJoin forkJoin) { @Override public void visit(BLangLiteral literalExpr) { - if (Types.getReferredType(literalExpr.getBType()).tag == TypeTags.ARRAY) { + int tag = Types.getReferredType(literalExpr.getBType()).tag; + if (tag == TypeTags.ARRAY || tag == TypeTags.TUPLE) { // this is blob literal as byte array result = rewriteBlobLiteral(literalExpr); return; @@ -6475,7 +6478,7 @@ private BLangStatementExpression createStmtExpr(BLangInvocation invocation) { continue; } - BInvokableSymbol invokableSymbol = defaultValues.get(paramName); + BInvokableSymbol invokableSymbol = defaultValues.get(Utils.unescapeBallerina(paramName)); BLangInvocation closureInvocation = getInvocation(invokableSymbol); for (int m = 0; m < invokableSymbol.params.size(); m++) { String langLibFuncParam = invokableSymbol.params.get(m).name.value; diff --git a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/parser/BLangNodeBuilder.java b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/parser/BLangNodeBuilder.java index 0bb02cf85954..274c4f9f0c83 100644 --- a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/parser/BLangNodeBuilder.java +++ b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/parser/BLangNodeBuilder.java @@ -944,8 +944,8 @@ public BLangNode transform(ConstantDeclarationNode constantDeclarationNode) { // Check whether the value is a literal or a unary expression and if it is not any one of the before mentioned // kinds it is an invalid case, so we don't need to consider it. - if (nodeKind == NodeKind.LITERAL || nodeKind == NodeKind.NUMERIC_LITERAL || - nodeKind == NodeKind.UNARY_EXPR) { + if ((nodeKind == NodeKind.LITERAL || nodeKind == NodeKind.NUMERIC_LITERAL || nodeKind == NodeKind.UNARY_EXPR) + && (constantNode.typeNode == null || constantNode.typeNode.getKind() != NodeKind.ARRAY_TYPE)) { // Note - If the RHS is a literal, we need to create an anonymous type definition which can later be used // in type definitions.h createAnonymousTypeDefForConstantDeclaration(constantNode, pos, identifierPos); diff --git a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/analyzer/CodeAnalyzer.java b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/analyzer/CodeAnalyzer.java index 1aa515723573..d140424458b9 100644 --- a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/analyzer/CodeAnalyzer.java +++ b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/analyzer/CodeAnalyzer.java @@ -1775,7 +1775,7 @@ private boolean isValidContextForInferredArray(BLangNode node) { private boolean isValidVariableForInferredArray(BLangNode node) { switch (node.getKind()) { case LITERAL: - if (node.getBType().tag == TypeTags.ARRAY) { + if (node.getBType().tag == TypeTags.ARRAY || node.getBType().tag == TypeTags.TUPLE) { return true; } break; diff --git a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/analyzer/ConstantTypeChecker.java b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/analyzer/ConstantTypeChecker.java index 20801e1c33bb..036825884ae9 100644 --- a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/analyzer/ConstantTypeChecker.java +++ b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/analyzer/ConstantTypeChecker.java @@ -256,6 +256,10 @@ public void visit(BLangLiteral literalExpr, AnalyzerData data) { return; } + if (literalType.tag == TypeTags.BYTE_ARRAY) { + literalType = rewriteByteArrayLiteral(literalExpr, data); + } + if (literalExpr.isFiniteContext) { return; } @@ -269,6 +273,24 @@ public void visit(BLangLiteral literalExpr, AnalyzerData data) { data.resultType = finiteType; } + private BType rewriteByteArrayLiteral(BLangLiteral literalExpr, AnalyzerData data) { + byte[] values = types.convertToByteArray((String) literalExpr.value); + + List memberTypes = new ArrayList<>(); + for (byte b : values) { + memberTypes.add(getFiniteType(Byte.toUnsignedLong(b), data.constantSymbol, literalExpr.pos, + symTable.intType)); + } + + BType expType = Types.getReferredType(data.expType); + if (expType.tag == TypeTags.ARRAY && ((BArrayType) expType).state == BArrayState.INFERRED) { + ((BArrayType) expType).size = memberTypes.size(); + ((BArrayType) expType).state = BArrayState.CLOSED; + } + + return createNewTupleType(literalExpr.pos, memberTypes, data); + } + @Override public void visit(BLangSimpleVarRef varRefExpr, AnalyzerData data) { // Set error type as the actual type. @@ -1092,6 +1114,7 @@ private BType checkListConstructorCompatibility(BType expType, BLangListConstruc switch (possibleType.tag) { case TypeTags.ARRAY: + case TypeTags.BYTE_ARRAY: return checkArrayType((BArrayType) possibleType, listConstructor, data); case TypeTags.TUPLE: return checkTupleType((BTupleType) possibleType, listConstructor, data); @@ -1364,6 +1387,7 @@ private BType checkExprIncompatible(BType eType, BLangExpression expr, AnalyzerD private BType getListConstructorCompatibleNonUnionType(BType type, AnalyzerData data) { switch (type.tag) { case TypeTags.ARRAY: + case TypeTags.BYTE_ARRAY: case TypeTags.TUPLE: case TypeTags.READONLY: case TypeTags.TYPEDESC: @@ -1717,12 +1741,6 @@ private BType setLiteralValueAndGetType(BLangLiteral literalExpr, BType expType, } } - // Byte arrays are not yet supported in constants. - if (literalExpr.getBType().tag == TypeTags.BYTE_ARRAY) { - dlog.error(literalExpr.pos, DiagnosticErrorCode.EXPRESSION_IS_NOT_A_CONSTANT_EXPRESSION); - return symTable.semanticError; - } - return literalType; } diff --git a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/analyzer/Types.java b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/analyzer/Types.java index b50335700f31..54f2a6d778b9 100644 --- a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/analyzer/Types.java +++ b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/analyzer/Types.java @@ -1018,8 +1018,9 @@ private boolean isAssignable(BType source, BType target, Set unresolve return isFunctionTypeAssignable((BInvokableType) source, (BInvokableType) target, new HashSet<>()); } - return sourceTag == TypeTags.ARRAY && targetTag == TypeTags.ARRAY && - isArrayTypesAssignable((BArrayType) source, target, unresolvedTypes); + return (sourceTag == TypeTags.ARRAY || sourceTag == TypeTags.BYTE_ARRAY) + && targetTag == TypeTags.ARRAY + && isArrayTypesAssignable((BArrayType) source, target, unresolvedTypes); } private boolean isMutable(BType type) { @@ -1542,6 +1543,7 @@ private boolean isSelectivelyImmutableType(BType input, boolean disallowReadOnly case TypeTags.XML_COMMENT: case TypeTags.XML_ELEMENT: case TypeTags.XML_PI: + case TypeTags.BYTE_ARRAY: return true; case TypeTags.ARRAY: BArrayType arrayType = (BArrayType) type; diff --git a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/model/SymbolTable.java b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/model/SymbolTable.java index 932a6acd8d86..e39f78e4aa3a 100644 --- a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/model/SymbolTable.java +++ b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/model/SymbolTable.java @@ -129,6 +129,7 @@ public class SymbolTable { public final BFutureType futureType = new BFutureType(TypeTags.FUTURE, nilType, null); public final BArrayType arrayType = new BArrayType(anyType); + public final BArrayType byteArrayType = new BArrayType(byteType); public final BArrayType arrayStringType = new BArrayType(stringType); BVarSymbol varSymbol = new BVarSymbol(0, null, null, noType, null, null, SymbolOrigin.VIRTUAL); @@ -385,6 +386,8 @@ public BType getTypeFromTag(int tag) { return charStringType; case TypeTags.REGEXP: return regExpType; + case TypeTags.BYTE_ARRAY: + return byteArrayType; default: return semanticError; } diff --git a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/util/ImmutableTypeCloner.java b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/util/ImmutableTypeCloner.java index 2d7e41661876..efd3034ca4eb 100644 --- a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/util/ImmutableTypeCloner.java +++ b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/util/ImmutableTypeCloner.java @@ -232,6 +232,7 @@ private static BIntersectionType setImmutableType(Location pos, Types types, return defineImmutableXMLType(pos, types, env, pkgId, owner, symTable, anonymousModelHelper, names, unresolvedTypes, (BXMLType) type); case TypeTags.ARRAY: + case TypeTags.BYTE_ARRAY: return defineImmutableArrayType(pos, types, env, pkgId, owner, symTable, anonymousModelHelper, names, unresolvedTypes, (BArrayType) type); case TypeTags.TUPLE: diff --git a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/programfile/ProgramFileConstants.java b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/programfile/ProgramFileConstants.java index f1cb1466360b..1d33e5fd969a 100644 --- a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/programfile/ProgramFileConstants.java +++ b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/programfile/ProgramFileConstants.java @@ -25,9 +25,9 @@ public class ProgramFileConstants { public static final int MAGIC_NUMBER = 0xBA1DA4CE; public static final short VERSION_NUMBER = 50; - public static final int BIR_VERSION_NUMBER = 69; - public static final short MIN_SUPPORTED_VERSION = 69; - public static final short MAX_SUPPORTED_VERSION = 69; + public static final int BIR_VERSION_NUMBER = 70; + public static final short MIN_SUPPORTED_VERSION = 70; + public static final short MAX_SUPPORTED_VERSION = 70; // todo move this to a proper place public static final String[] SUPPORTED_PLATFORMS = {"java17", "java11"}; diff --git a/compiler/ballerina-lang/src/test/java/io/ballerina/projects/FileSystemRepositoryGetPackagesTests.java b/compiler/ballerina-lang/src/test/java/io/ballerina/projects/FileSystemRepositoryGetPackagesTests.java index 043541e6ba6e..7cb37ae1f8ac 100644 --- a/compiler/ballerina-lang/src/test/java/io/ballerina/projects/FileSystemRepositoryGetPackagesTests.java +++ b/compiler/ballerina-lang/src/test/java/io/ballerina/projects/FileSystemRepositoryGetPackagesTests.java @@ -69,6 +69,8 @@ public void setupEmptyRepository() { public void testGetPackagesForCorrectPackages() { Assert.assertTrue(nonEmptyRepoPackages.containsKey("foo")); Assert.assertTrue(nonEmptyRepoPackages.get("foo").contains("package_a:1.1.0")); + Assert.assertTrue(nonEmptyRepoPackages.get("foo").contains("package_a:1.2.0")); + Assert.assertTrue(nonEmptyRepoPackages.get("foo").contains("package_b:0.7.8")); Assert.assertTrue(nonEmptyRepoPackages.get("foo").contains("package_b:6.7.8")); Assert.assertTrue(nonEmptyRepoPackages.containsKey("bar")); diff --git a/compiler/ballerina-lang/src/test/resources/repository-resources/non-empty-repo/bala/foo/package_a/1.2.0/.gitkeep b/compiler/ballerina-lang/src/test/resources/repository-resources/non-empty-repo/bala/foo/package_a/1.2.0/.gitkeep new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/compiler/ballerina-lang/src/test/resources/repository-resources/non-empty-repo/bala/foo/package_b/0.7.8/.gitkeep b/compiler/ballerina-lang/src/test/resources/repository-resources/non-empty-repo/bala/foo/package_b/0.7.8/.gitkeep new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/BallerinaParser.java b/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/BallerinaParser.java index fa7e055a573d..db5bc23b717a 100644 --- a/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/BallerinaParser.java +++ b/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/BallerinaParser.java @@ -4145,17 +4145,19 @@ private STNode parseQualifiedIdentifier(STNode identifier, boolean isInCondition STToken colon = consume(); STNode varOrFuncName = consume(); return createQualifiedNameReferenceNode(identifier, colon, varOrFuncName); - case MAP_KEYWORD: - colon = consume(); - STToken mapKeyword = consume(); - STNode refName = STNodeFactory.createIdentifierToken(mapKeyword.text(), mapKeyword.leadingMinutiae(), - mapKeyword.trailingMinutiae(), mapKeyword.diagnostics()); - return createQualifiedNameReferenceNode(identifier, colon, refName); case COLON_TOKEN: // specially handle cases where there are more than one colon. addInvalidTokenToNextToken(errorHandler.consumeInvalidToken()); return parseQualifiedIdentifier(identifier, isInConditionalExpr); default: + if (nextNextToken.kind == SyntaxKind.MAP_KEYWORD && peek(3).kind != SyntaxKind.LT_TOKEN) { + colon = consume(); + STToken mapKeyword = consume(); + STNode refName = STNodeFactory.createIdentifierToken(mapKeyword.text(), + mapKeyword.leadingMinutiae(), mapKeyword.trailingMinutiae(), mapKeyword.diagnostics()); + return createQualifiedNameReferenceNode(identifier, colon, refName); + } + if (isInConditionalExpr) { return ConditionalExprResolver.getSimpleNameRefNode(identifier); } diff --git a/compiler/ballerina-parser/src/test/java/io/ballerinalang/compiler/parser/test/syntax/expressions/QualifiedIdentifierTest.java b/compiler/ballerina-parser/src/test/java/io/ballerinalang/compiler/parser/test/syntax/expressions/QualifiedIdentifierTest.java index 1f2311832003..e3f6282f0a2d 100644 --- a/compiler/ballerina-parser/src/test/java/io/ballerinalang/compiler/parser/test/syntax/expressions/QualifiedIdentifierTest.java +++ b/compiler/ballerina-parser/src/test/java/io/ballerinalang/compiler/parser/test/syntax/expressions/QualifiedIdentifierTest.java @@ -65,7 +65,13 @@ public void testIncompleteQualifiedIdent() { @Test public void testInterveningWSNotAllowed() { - testFile("qualified-identifier/qualified_identifier_assert_08.bal", + testFile("qualified-identifier/qualified_identifier_source_08.bal", "qualified-identifier/qualified_identifier_assert_08.json"); } + + @Test + public void testMapTypeAfterColon() { + testFile("qualified-identifier/qualified_identifier_source_09.bal", + "qualified-identifier/qualified_identifier_assert_09.json"); + } } diff --git a/compiler/ballerina-parser/src/test/resources/expressions/qualified-identifier/qualified_identifier_assert_09.json b/compiler/ballerina-parser/src/test/resources/expressions/qualified-identifier/qualified_identifier_assert_09.json new file mode 100644 index 000000000000..5b0693426696 --- /dev/null +++ b/compiler/ballerina-parser/src/test/resources/expressions/qualified-identifier/qualified_identifier_assert_09.json @@ -0,0 +1,247 @@ +{ + "kind": "FUNCTION_DEFINITION", + "hasDiagnostics": true, + "children": [ + { + "kind": "LIST", + "children": [ + { + "kind": "PUBLIC_KEYWORD", + "trailingMinutiae": [ + { + "kind": "WHITESPACE_MINUTIAE", + "value": " " + } + ] + } + ] + }, + { + "kind": "FUNCTION_KEYWORD", + "trailingMinutiae": [ + { + "kind": "WHITESPACE_MINUTIAE", + "value": " " + } + ] + }, + { + "kind": "IDENTIFIER_TOKEN", + "value": "main" + }, + { + "kind": "LIST", + "children": [] + }, + { + "kind": "FUNCTION_SIGNATURE", + "children": [ + { + "kind": "OPEN_PAREN_TOKEN" + }, + { + "kind": "LIST", + "children": [] + }, + { + "kind": "CLOSE_PAREN_TOKEN", + "trailingMinutiae": [ + { + "kind": "WHITESPACE_MINUTIAE", + "value": " " + } + ] + } + ] + }, + { + "kind": "FUNCTION_BODY_BLOCK", + "hasDiagnostics": true, + "children": [ + { + "kind": "OPEN_BRACE_TOKEN", + "trailingMinutiae": [ + { + "kind": "END_OF_LINE_MINUTIAE", + "value": "\n" + } + ] + }, + { + "kind": "LIST", + "hasDiagnostics": true, + "children": [ + { + "kind": "INVALID_EXPRESSION_STATEMENT", + "hasDiagnostics": true, + "diagnostics": [ + "ERROR_INVALID_EXPRESSION_STATEMENT" + ], + "children": [ + { + "kind": "QUALIFIED_NAME_REFERENCE", + "hasDiagnostics": true, + "children": [ + { + "kind": "IDENTIFIER_TOKEN", + "value": "module1", + "leadingMinutiae": [ + { + "kind": "WHITESPACE_MINUTIAE", + "value": " " + } + ] + }, + { + "kind": "COLON_TOKEN", + "hasDiagnostics": true, + "diagnostics": [ + "ERROR_INTERVENING_WHITESPACES_ARE_NOT_ALLOWED" + ], + "trailingMinutiae": [ + { + "kind": "END_OF_LINE_MINUTIAE", + "value": "\n" + } + ] + }, + { + "kind": "IDENTIFIER_TOKEN", + "isMissing": true, + "hasDiagnostics": true, + "diagnostics": [ + "ERROR_MISSING_IDENTIFIER" + ] + } + ] + }, + { + "kind": "SEMICOLON_TOKEN", + "isMissing": true, + "hasDiagnostics": true, + "diagnostics": [ + "ERROR_MISSING_SEMICOLON_TOKEN" + ] + } + ] + }, + { + "kind": "LOCAL_VAR_DECL", + "children": [ + { + "kind": "LIST", + "children": [] + }, + { + "kind": "TYPED_BINDING_PATTERN", + "children": [ + { + "kind": "MAP_TYPE_DESC", + "children": [ + { + "kind": "MAP_KEYWORD", + "leadingMinutiae": [ + { + "kind": "END_OF_LINE_MINUTIAE", + "value": "\n" + }, + { + "kind": "WHITESPACE_MINUTIAE", + "value": " " + } + ] + }, + { + "kind": "TYPE_PARAMETER", + "children": [ + { + "kind": "LT_TOKEN" + }, + { + "kind": "INT_TYPE_DESC", + "children": [ + { + "kind": "INT_KEYWORD" + } + ] + }, + { + "kind": "GT_TOKEN", + "trailingMinutiae": [ + { + "kind": "WHITESPACE_MINUTIAE", + "value": " " + } + ] + } + ] + } + ] + }, + { + "kind": "CAPTURE_BINDING_PATTERN", + "children": [ + { + "kind": "IDENTIFIER_TOKEN", + "value": "m", + "trailingMinutiae": [ + { + "kind": "WHITESPACE_MINUTIAE", + "value": " " + } + ] + } + ] + } + ] + }, + { + "kind": "EQUAL_TOKEN", + "trailingMinutiae": [ + { + "kind": "WHITESPACE_MINUTIAE", + "value": " " + } + ] + }, + { + "kind": "MAPPING_CONSTRUCTOR", + "children": [ + { + "kind": "OPEN_BRACE_TOKEN" + }, + { + "kind": "LIST", + "children": [] + }, + { + "kind": "CLOSE_BRACE_TOKEN" + } + ] + }, + { + "kind": "SEMICOLON_TOKEN", + "trailingMinutiae": [ + { + "kind": "END_OF_LINE_MINUTIAE", + "value": "\n" + } + ] + } + ] + } + ] + }, + { + "kind": "CLOSE_BRACE_TOKEN", + "trailingMinutiae": [ + { + "kind": "END_OF_LINE_MINUTIAE", + "value": "\n" + } + ] + } + ] + } + ] +} diff --git a/compiler/ballerina-parser/src/test/resources/expressions/qualified-identifier/qualified_identifier_assert_08.bal b/compiler/ballerina-parser/src/test/resources/expressions/qualified-identifier/qualified_identifier_source_08.bal similarity index 100% rename from compiler/ballerina-parser/src/test/resources/expressions/qualified-identifier/qualified_identifier_assert_08.bal rename to compiler/ballerina-parser/src/test/resources/expressions/qualified-identifier/qualified_identifier_source_08.bal diff --git a/compiler/ballerina-parser/src/test/resources/expressions/qualified-identifier/qualified_identifier_source_09.bal b/compiler/ballerina-parser/src/test/resources/expressions/qualified-identifier/qualified_identifier_source_09.bal new file mode 100644 index 000000000000..c28d7b3fe20d --- /dev/null +++ b/compiler/ballerina-parser/src/test/resources/expressions/qualified-identifier/qualified_identifier_source_09.bal @@ -0,0 +1,5 @@ +public function main() { + module1: + + map m = {}; +} diff --git a/docs/bir-spec/src/main/resources/kaitai/bir.ksy b/docs/bir-spec/src/main/resources/kaitai/bir.ksy index 0fd03ee4748d..fa1a7fba9f8f 100644 --- a/docs/bir-spec/src/main/resources/kaitai/bir.ksy +++ b/docs/bir-spec/src/main/resources/kaitai/bir.ksy @@ -294,16 +294,12 @@ types: type: s4 type_object_or_service: seq: - - id: is_object_type - type: s1 - id: pkd_id_cp_index type: s4 - id: name_cp_index type: s4 - - id: is_abstract - type: u1 - - id: is_client - type: u1 + - id: object_symbol_flags + type: s8 - id: object_fields_count type: s4 - id: object_fields diff --git a/gradle.properties b/gradle.properties index 7c8b55eb71cc..6bcb24537c34 100644 --- a/gradle.properties +++ b/gradle.properties @@ -135,7 +135,7 @@ snakeyamlVersion=2.0 sonarqubeGradlePluginVersion=4.0.0.2929 sonarcloudVersion=3.4.0.2513 spullaraMustacheCompilerVersion=0.8.9 -squareupOkioVersion=2.2.2 +squareupOkioVersion=3.4.0 swaggerModelsVersion=2.1.13 swaggerParserVersion=2.0.30 swaggerParserV2Version=2.0.30 diff --git a/language-server/modules/langserver-commons/src/main/java/org/ballerinalang/langserver/commons/completion/LSCompletionItem.java b/language-server/modules/langserver-commons/src/main/java/org/ballerinalang/langserver/commons/completion/LSCompletionItem.java index c3e087b02765..79dae8ed7709 100644 --- a/language-server/modules/langserver-commons/src/main/java/org/ballerinalang/langserver/commons/completion/LSCompletionItem.java +++ b/language-server/modules/langserver-commons/src/main/java/org/ballerinalang/langserver/commons/completion/LSCompletionItem.java @@ -44,5 +44,6 @@ enum CompletionItemType { TYPE, FUNCTION_POINTER, NAMED_ARG, + SPREAD } } diff --git a/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/CentralPackageDescriptorLoader.java b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/CentralPackageDescriptorLoader.java index 39235c10973b..baeec04df86b 100644 --- a/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/CentralPackageDescriptorLoader.java +++ b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/CentralPackageDescriptorLoader.java @@ -70,7 +70,7 @@ public void loadBallerinaxPackagesFromCentral(LanguageServerContext lsContext) { languageClient.createProgress(workDoneProgressCreateParams); WorkDoneProgressBegin beginNotification = new WorkDoneProgressBegin(); - beginNotification.setTitle("Loading Ballerina Central Packages"); + beginNotification.setTitle("Ballerina Central Packages"); beginNotification.setCancellable(false); beginNotification.setMessage("Loading..."); languageClient.notifyProgress(new ProgressParams(Either.forLeft(taskId), diff --git a/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/codeaction/CodeActionRouter.java b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/codeaction/CodeActionRouter.java index 925532c80258..bbf4fa805708 100644 --- a/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/codeaction/CodeActionRouter.java +++ b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/codeaction/CodeActionRouter.java @@ -73,6 +73,12 @@ public static List getAvailableCodeActions(CodeActionContext ctx) { " Syntax tree is empty for file " + ctx.fileUri()); return Collections.emptyList(); } + if (ctx.currentSemanticModel().isEmpty()) { + clientLogger.logTrace(LSContextOperation.TXT_CODE_ACTION.getName() + " " + + " Semantic model is empty for module " + ctx.currentModule() + .map(module -> module.moduleName().toString()).orElse("")); + return Collections.emptyList(); + } Range highlightedRange = ctx.range(); // Run code action node analyzer CodeActionNodeAnalyzer analyzer = CodeActionNodeAnalyzer.analyze(highlightedRange, syntaxTree.get()); 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 d3687f1ddcba..5592b789a63e 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 @@ -398,7 +398,7 @@ public static List getTypeGuardCodeActionEdits(String varName, Range r if (transitiveBinaryUnion) { members.removeIf(typeSymbol -> CommonUtil.getRawType(typeSymbol).typeKind() == TypeDescKind.ERROR); } - + 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()) { @@ -433,7 +433,7 @@ public static List getTypeGuardCodeActionEdits(String varName, Range r } edits.add(new TextEdit(newTextRange, generateIfElseText(varName, spaces, padding, memberTypes))); } - + edits.addAll(importsAcceptor.getNewImportTextEdits()); return edits; } @@ -453,72 +453,83 @@ public static List addSettersCodeActionEdits(String varName, Range ran } public static List getAddCheckTextEdits(Position pos, NonTerminalNode matchedNode, - CodeActionContext context) { + CodeActionContext context, + List errorTypeSymbols, + ImportsAcceptor acceptor) { + if (errorTypeSymbols.isEmpty()) { + return Collections.emptyList(); + } List edits = new ArrayList<>(); - Optional enclosedFunc = getEnclosedFunction(matchedNode); + Optional enclosedFuncNode = getEnclosedFunction(matchedNode); String returnText = ""; Range returnRange = null; - if (enclosedFunc.isPresent()) { - SemanticModel semanticModel = context.currentSemanticModel().orElseThrow(); - Document document = context.currentDocument().orElseThrow(); - Optional optEnclosedFuncSymbol = - semanticModel.symbol(document, enclosedFunc.get().functionName().lineRange().startLine()); - FunctionSymbol enclosedFuncSymbol = null; - if (optEnclosedFuncSymbol.isPresent()) { - Symbol funcSymbol = optEnclosedFuncSymbol.get(); - if (funcSymbol.kind() == SymbolKind.FUNCTION || funcSymbol.kind() == SymbolKind.METHOD || - funcSymbol.kind() == SymbolKind.RESOURCE_METHOD) { - enclosedFuncSymbol = (FunctionSymbol) optEnclosedFuncSymbol.get(); + Optional semanticModel = context.currentSemanticModel(); + Optional document = context.currentDocument(); + + if (enclosedFuncNode.isPresent() && semanticModel.isPresent() && document.isPresent()) { + if (enclosedFuncNode.get().functionSignature().returnTypeDesc().isPresent()) { + // Enclosing function already has a return-type + ReturnTypeDescriptorNode enclosedRetTypeDescNode = + enclosedFuncNode.get().functionSignature().returnTypeDesc().get(); + Optional returnTypeDescriptor = + semanticModel.get().symbol(document.get(), + enclosedFuncNode.get().functionName().lineRange().startLine()) + .filter(funcSymbol -> funcSymbol.kind() == SymbolKind.FUNCTION + || funcSymbol.kind() == SymbolKind.METHOD + || funcSymbol.kind() == SymbolKind.RESOURCE_METHOD) + .flatMap(symbol -> ((FunctionSymbol) symbol).typeDescriptor().returnTypeDescriptor()); + + if (returnTypeDescriptor.isEmpty()) { + return Collections.emptyList(); } - } - if (enclosedFuncSymbol != null) { - boolean hasFuncNodeReturn = enclosedFunc.get().functionSignature().returnTypeDesc().isPresent(); - boolean hasFuncSymbolReturn = enclosedFuncSymbol.typeDescriptor().returnTypeDescriptor().isPresent(); - if (hasFuncNodeReturn && hasFuncSymbolReturn) { - // Parent function already has a return-type - TypeSymbol enclosedRetTypeDesc = enclosedFuncSymbol.typeDescriptor().returnTypeDescriptor().get(); - ReturnTypeDescriptorNode enclosedRetTypeDescNode = - enclosedFunc.get().functionSignature().returnTypeDesc().get(); - if (enclosedRetTypeDesc.typeKind() == TypeDescKind.UNION) { - // Parent function already has a union return-type - UnionTypeSymbol parentUnionRetTypeDesc = (UnionTypeSymbol) enclosedRetTypeDesc; - boolean hasErrorMember = parentUnionRetTypeDesc.memberTypeDescriptors().stream() - .anyMatch(m -> m.typeKind() == TypeDescKind.ERROR); - if (!hasErrorMember) { - // Union has no error member-type - String typeName = - CodeActionUtil.getPossibleType(parentUnionRetTypeDesc, edits, context) - .orElseThrow(); - returnText = "returns " + typeName + "|error"; - returnRange = PositionUtil.toRange(enclosedRetTypeDescNode.lineRange()); - } - } else if (enclosedRetTypeDesc.typeKind() == TypeDescKind.COMPILATION_ERROR) { - String returnType = enclosedRetTypeDescNode.type().toString().replaceAll("\\s+", ""); - returnText = "returns " + returnType + "|error"; - returnRange = PositionUtil.toRange(enclosedRetTypeDescNode.lineRange()); + List allErrorTypes = new ArrayList<>(errorTypeSymbols); + Pair, List> errorAndNonErrorTypedSymbols = + getErrorAndNonErrorTypedSymbols(returnTypeDescriptor.get()); + allErrorTypes.addAll(errorAndNonErrorTypedSymbols.getRight()); + List errorSymbolsToAdd = filterErrorSubTypes(allErrorTypes); + + boolean isNewErrorTypeAvailable = errorSymbolsToAdd.stream() + .anyMatch(typeSymbol -> errorAndNonErrorTypedSymbols.getRight().stream() + .noneMatch(otherSymbol -> otherSymbol.signature().equals(typeSymbol.signature()))); + if (!errorSymbolsToAdd.isEmpty() && isNewErrorTypeAvailable) { + if (returnTypeDescriptor.get().typeKind() == TypeDescKind.COMPILATION_ERROR) { + String returnType = enclosedRetTypeDescNode.type().toString() + .replaceAll("\\s+", ""); + UnionTypeSymbol newMemberType = semanticModel.get().types().builder().UNION_TYPE + .withMemberTypes(errorSymbolsToAdd.toArray(new TypeSymbol[0])).build(); + returnText = String.format("returns %s|%s", returnType, newMemberType.signature()); } else { - // Parent function already has another return-type - if (enclosedRetTypeDesc.typeKind() != TypeDescKind.ERROR) { - String typeName = - CodeActionUtil.getPossibleType(enclosedRetTypeDesc, edits, context).orElseThrow(); - returnText = "returns " + typeName + "|error"; - } - returnRange = PositionUtil.toRange(enclosedRetTypeDescNode.lineRange()); + List memberTypes = new ArrayList<>(); + //Exclude NIL return type and add it to the end of the return statement + boolean nilReturnType = errorAndNonErrorTypedSymbols.getLeft().stream() + .anyMatch(typeSymbol -> typeSymbol.typeKind() == TypeDescKind.NIL); + memberTypes.addAll(errorAndNonErrorTypedSymbols.getLeft().stream() + .filter(typeSymbol -> typeSymbol.typeKind() != TypeDescKind.NIL) + .collect(Collectors.toList())); + memberTypes.addAll(errorSymbolsToAdd); + UnionTypeSymbol newType = semanticModel.get().types().builder().UNION_TYPE + .withMemberTypes(memberTypes.toArray(new TypeSymbol[0])).build(); + String typeName = CodeActionUtil.getPossibleType(newType, context, acceptor).orElseThrow(); + returnText = String.format("returns %s", typeName + (nilReturnType ? "?" : "")); } - } else { - // Parent function has no return - returnText = " returns error?"; - Position position = PositionUtil.toPosition( - enclosedFunc.get().functionSignature().closeParenToken().lineRange().endLine()); - returnRange = new Range(position, position); + returnRange = PositionUtil.toRange(enclosedRetTypeDescNode.lineRange()); } + } else { + // Parent function has no return + List errorSymbolsToAdd = filterErrorSubTypes(errorTypeSymbols); + UnionTypeSymbol newMemberType = semanticModel.get().types().builder().UNION_TYPE + .withMemberTypes(errorSymbolsToAdd.toArray(new TypeSymbol[0])).build(); + String typeName = CodeActionUtil.getPossibleType(newMemberType, context, acceptor).orElseThrow(); + returnText = String.format(" returns %s?", typeName); + Position position = PositionUtil.toPosition( + enclosedFuncNode.get().functionSignature().closeParenToken().lineRange().endLine()); + returnRange = new Range(position, position); } } - // 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 && + 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), "(")); @@ -535,6 +546,36 @@ public static List getAddCheckTextEdits(Position pos, NonTerminalNode return edits; } + private static List filterErrorSubTypes(List errorTypeSymbols) { + if (errorTypeSymbols.size() == 1) { + return errorTypeSymbols; + } + List errorTypeSymbolsClone = new ArrayList<>(errorTypeSymbols); + return errorTypeSymbolsClone.stream().filter(typeSymbol -> + errorTypeSymbols.stream().filter(other -> !other.signature().equals(typeSymbol.signature())) + .noneMatch(typeSymbol::subtypeOf)).collect(Collectors.toList()); + } + + private static Pair, List> getErrorAndNonErrorTypedSymbols( + TypeSymbol returnTypeDescriptor) { + if (returnTypeDescriptor.typeKind() == TypeDescKind.UNION) { + List errorTypeSymbols = new ArrayList<>(); + List nonErrorTypeSymbols = new ArrayList<>(); + for (TypeSymbol typeSymbol : ((UnionTypeSymbol) returnTypeDescriptor).memberTypeDescriptors()) { + if (CommonUtil.getRawType(typeSymbol).typeKind() == TypeDescKind.ERROR) { + errorTypeSymbols.add(typeSymbol); + } else { + nonErrorTypeSymbols.add(typeSymbol); + } + } + return Pair.of(nonErrorTypeSymbols, errorTypeSymbols); + } + if (CommonUtil.getRawType(returnTypeDescriptor).typeKind() == TypeDescKind.ERROR) { + return Pair.of(Collections.emptyList(), List.of(returnTypeDescriptor)); + } + return Pair.of(List.of(returnTypeDescriptor), Collections.emptyList()); + } + /** * Returns the largest expression node for this range from bottom-up approach. * @@ -632,9 +673,17 @@ public static Optional getEnclosedFunction(Node matchedN || parentNode.parent().kind() == SyntaxKind.SERVICE_DECLARATION || parentNode.parent().kind() == SyntaxKind.OBJECT_CONSTRUCTOR)) { isFunctionDef = true; - } else if (parentNode.kind() == SyntaxKind.RESOURCE_ACCESSOR_DEFINITION && - parentNode.parent().kind() == SyntaxKind.SERVICE_DECLARATION) { - isFunctionDef = true; + } else if (parentNode.kind() == SyntaxKind.RESOURCE_ACCESSOR_DEFINITION) { + NonTerminalNode evalNode = parentNode.parent(); + if (evalNode.kind() == SyntaxKind.SERVICE_DECLARATION) { + isFunctionDef = true; + } else if (evalNode.kind() == SyntaxKind.CLASS_DEFINITION) { + isFunctionDef = ((ClassDefinitionNode) evalNode) + .classTypeQualifiers().stream() + .anyMatch(qualifier-> qualifier.kind() == SyntaxKind.CLIENT_KEYWORD); + } else if (evalNode.kind() == SyntaxKind.OBJECT_CONSTRUCTOR) { + isFunctionDef = true; + } } if (isFunctionDef) { 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 2fb87e978258..0da60e38fab2 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 @@ -28,6 +28,7 @@ import org.ballerinalang.langserver.codeaction.CodeActionUtil; import org.ballerinalang.langserver.codeaction.MatchedExpressionNodeResolver; import org.ballerinalang.langserver.codeaction.providers.changetype.TypeCastCodeAction; +import org.ballerinalang.langserver.common.ImportsAcceptor; import org.ballerinalang.langserver.common.constants.CommandConstants; import org.ballerinalang.langserver.common.utils.CommonUtil; import org.ballerinalang.langserver.common.utils.PositionUtil; @@ -43,6 +44,7 @@ import java.util.List; import java.util.Optional; import java.util.Set; +import java.util.stream.Collectors; /** * Code Action for error type handle. @@ -120,8 +122,14 @@ public List getCodeActions(Diagnostic diagnostic, DiagBasedPositionD pos = PositionUtil.toRange(expressionNode.get().location().lineRange()).getStart(); } + List errorTypeSymbols = ((UnionTypeSymbol) foundType.get()).memberTypeDescriptors().stream() + .filter(typeSymbol -> CommonUtil.getRawType(typeSymbol).typeKind() == TypeDescKind.ERROR) + .collect(Collectors.toList()); + + ImportsAcceptor acceptor = new ImportsAcceptor(context); List edits = new ArrayList<>(CodeActionUtil.getAddCheckTextEdits( - pos, positionDetails.matchedNode(), context)); + pos, positionDetails.matchedNode(), context, errorTypeSymbols, acceptor)); + edits.addAll(acceptor.getNewImportTextEdits()); if (edits.isEmpty()) { return Collections.emptyList(); } diff --git a/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/codeaction/providers/createvar/CreateVariableCodeAction.java b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/codeaction/providers/createvar/CreateVariableCodeAction.java index e165aea7d668..7e99a2d9c80b 100644 --- a/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/codeaction/providers/createvar/CreateVariableCodeAction.java +++ b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/codeaction/providers/createvar/CreateVariableCodeAction.java @@ -117,13 +117,13 @@ public List getCodeActions(Diagnostic diagnostic, private boolean isCompilationErrorTyped(TypeSymbol typeSymbol) { if (typeSymbol.typeKind() == TypeDescKind.UNION) { - return isUnionCompErrorTyped((UnionTypeSymbol) typeSymbol); + return isCompilationErrorTyped((UnionTypeSymbol) typeSymbol); } return typeSymbol.typeKind() == TypeDescKind.COMPILATION_ERROR; } - protected boolean isUnionCompErrorTyped(UnionTypeSymbol unionTypeSymbol) { + protected boolean isCompilationErrorTyped(UnionTypeSymbol unionTypeSymbol) { return unionTypeSymbol.memberTypeDescriptors().stream() .anyMatch(tSymbol -> tSymbol.typeKind() == TypeDescKind.COMPILATION_ERROR); diff --git a/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/codeaction/providers/createvar/ErrorHandleInsideCodeAction.java b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/codeaction/providers/createvar/ErrorHandleInsideCodeAction.java index debd9a8fba0d..ed480ca471e8 100644 --- a/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/codeaction/providers/createvar/ErrorHandleInsideCodeAction.java +++ b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/codeaction/providers/createvar/ErrorHandleInsideCodeAction.java @@ -71,7 +71,7 @@ public List getCodeActions(Diagnostic diagnostic, Optional typeDescriptor = getExpectedTypeSymbol(positionDetails); if (typeDescriptor.isEmpty() || typeDescriptor.get().typeKind() != TypeDescKind.UNION - || isUnionCompErrorTyped((UnionTypeSymbol) typeDescriptor.get())) { + || isCompilationErrorTyped((UnionTypeSymbol) typeDescriptor.get())) { return Collections.emptyList(); } diff --git a/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/codeaction/providers/createvar/ErrorHandleOutsideCodeAction.java b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/codeaction/providers/createvar/ErrorHandleOutsideCodeAction.java index 3e1fc03c3545..224521044605 100644 --- a/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/codeaction/providers/createvar/ErrorHandleOutsideCodeAction.java +++ b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/codeaction/providers/createvar/ErrorHandleOutsideCodeAction.java @@ -79,27 +79,28 @@ public List getCodeActions(Diagnostic diagnostic, Optional typeSymbol = getExpectedTypeSymbol(positionDetails); if (typeSymbol.isEmpty() || typeSymbol.get().typeKind() != TypeDescKind.UNION - || isUnionCompErrorTyped((UnionTypeSymbol) typeSymbol.get())) { + || isCompilationErrorTyped((UnionTypeSymbol) typeSymbol.get())) { return Collections.emptyList(); } UnionTypeSymbol unionTypeDesc = (UnionTypeSymbol) typeSymbol.get(); - boolean hasErrorMemberType = unionTypeDesc.memberTypeDescriptors().stream() - .anyMatch(member -> CommonUtil.getRawType(member).typeKind() == TypeDescKind.ERROR); + List errorMemberTypes = unionTypeDesc.memberTypeDescriptors().stream() + .filter(member -> CommonUtil.getRawType(member).typeKind() == TypeDescKind.ERROR) + .collect(Collectors.toList()); long nonErrorNonNilMemberCount = unionTypeDesc.memberTypeDescriptors().stream() .filter(member -> CommonUtil.getRawType(member).typeKind() != TypeDescKind.ERROR && member.typeKind() != TypeDescKind.NIL) .count(); - if (!hasErrorMemberType || nonErrorNonNilMemberCount == 0) { + if (errorMemberTypes.isEmpty() || nonErrorNonNilMemberCount == 0) { return Collections.emptyList(); } ImportsAcceptor importsAcceptor = new ImportsAcceptor(context); - List edits = new ArrayList<>(); - CreateVariableOut modifiedTextEdits = getModifiedCreateVarTextEdits(diagnostic, unionTypeDesc, positionDetails, - typeSymbol.get(), context, importsAcceptor); - edits.addAll(modifiedTextEdits.edits); - edits.addAll(CodeActionUtil.getAddCheckTextEdits( + CreateVariableOut modifiedTextEdits = getModifiedCreateVarTextEdits(diagnostic, unionTypeDesc, + positionDetails, typeSymbol.get(), context, importsAcceptor); + List edits = new ArrayList<>(modifiedTextEdits.edits); + List addCheckTextEdits = CodeActionUtil.getAddCheckTextEdits( PositionUtil.toRange(diagnostic.location().lineRange()).getStart(), - positionDetails.matchedNode(), context)); + positionDetails.matchedNode(), context, errorMemberTypes, importsAcceptor); + edits.addAll(addCheckTextEdits); edits.addAll(importsAcceptor.getNewImportTextEdits()); CodeAction codeAction = CodeActionUtil.createCodeAction(CommandConstants.CREATE_VAR_ADD_CHECK_TITLE, diff --git a/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/command/visitors/FunctionCallExpressionTypeFinder.java b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/command/visitors/FunctionCallExpressionTypeFinder.java index 3009015a1de6..a46e39049002 100644 --- a/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/command/visitors/FunctionCallExpressionTypeFinder.java +++ b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/command/visitors/FunctionCallExpressionTypeFinder.java @@ -20,6 +20,7 @@ import io.ballerina.compiler.api.SemanticModel; import io.ballerina.compiler.api.TypeBuilder; import io.ballerina.compiler.api.Types; +import io.ballerina.compiler.api.symbols.ArrayTypeSymbol; import io.ballerina.compiler.api.symbols.ClassSymbol; import io.ballerina.compiler.api.symbols.ErrorTypeSymbol; import io.ballerina.compiler.api.symbols.FunctionTypeSymbol; @@ -28,6 +29,7 @@ import io.ballerina.compiler.api.symbols.ParameterSymbol; import io.ballerina.compiler.api.symbols.RecordFieldSymbol; import io.ballerina.compiler.api.symbols.RecordTypeSymbol; +import io.ballerina.compiler.api.symbols.StreamTypeSymbol; import io.ballerina.compiler.api.symbols.Symbol; import io.ballerina.compiler.api.symbols.SymbolKind; import io.ballerina.compiler.api.symbols.TypeDescKind; @@ -63,11 +65,13 @@ import io.ballerina.compiler.syntax.tree.RecordFieldWithDefaultValueNode; import io.ballerina.compiler.syntax.tree.RemoteMethodCallActionNode; import io.ballerina.compiler.syntax.tree.ReturnStatementNode; +import io.ballerina.compiler.syntax.tree.SelectClauseNode; import io.ballerina.compiler.syntax.tree.SeparatedNodeList; import io.ballerina.compiler.syntax.tree.SimpleNameReferenceNode; import io.ballerina.compiler.syntax.tree.SpecificFieldNode; import io.ballerina.compiler.syntax.tree.StartActionNode; import io.ballerina.compiler.syntax.tree.SyntaxKind; +import io.ballerina.compiler.syntax.tree.TypedBindingPatternNode; import io.ballerina.compiler.syntax.tree.UnaryExpressionNode; import io.ballerina.compiler.syntax.tree.VariableDeclarationNode; import io.ballerina.compiler.syntax.tree.WhileStatementNode; @@ -114,9 +118,7 @@ public void visit(RecordFieldWithDefaultValueNode recordFieldWithDefaultValueNod @Override public void visit(ModuleVariableDeclarationNode moduleVariableDeclarationNode) { - Symbol symbol = semanticModel.symbol(moduleVariableDeclarationNode).orElse(null); - TypeSymbol typeDescriptor = SymbolUtil.getTypeDescriptor(symbol).orElse(null); - checkAndSetTypeResult(typeDescriptor); + visitVariableDeclaration(moduleVariableDeclarationNode, moduleVariableDeclarationNode.typedBindingPattern()); } @Override @@ -134,9 +136,7 @@ public void visit(AssignmentStatementNode assignmentStatementNode) { @Override public void visit(VariableDeclarationNode variableDeclarationNode) { - Symbol symbol = semanticModel.symbol(variableDeclarationNode).orElse(null); - TypeSymbol typeDescriptor = SymbolUtil.getTypeDescriptor(symbol).orElse(null); - checkAndSetTypeResult(typeDescriptor); + visitVariableDeclaration(variableDeclarationNode, variableDeclarationNode.typedBindingPattern()); } @Override @@ -486,6 +486,19 @@ public void visit(GroupingKeyVarDeclarationNode groupingKeyVarDeclarationNode) { TypeSymbol typeDescriptor = SymbolUtil.getTypeDescriptor(symbol).orElse(null); checkAndSetTypeResult(typeDescriptor); } + + @Override + public void visit(SelectClauseNode selectClauseNode) { + selectClauseNode.parent().parent().accept(this); + if (resultFound) { + TypeDescKind kind = this.returnTypeSymbol.typeKind(); + if (kind == TypeDescKind.ARRAY) { + checkAndSetTypeResult(((ArrayTypeSymbol) returnTypeSymbol).memberTypeDescriptor()); + } else if (kind == TypeDescKind.STREAM) { + checkAndSetTypeResult(((StreamTypeSymbol) returnTypeSymbol).typeParameter()); + } + } + } @Override public void visit(PanicStatementNode panicStatementNode) { @@ -522,4 +535,19 @@ private void resetResult() { public Optional getReturnTypeSymbol() { return Optional.ofNullable(returnTypeSymbol); } + + private void visitVariableDeclaration(Node variableDeclarationNode, TypedBindingPatternNode typedBindingNode) { + Symbol symbol = semanticModel.symbol(variableDeclarationNode).orElse(null); + Optional typeDescriptor = SymbolUtil.getTypeDescriptor(symbol); + TypeSymbol ts = null; + if (typeDescriptor.isPresent()) { + ts = typeDescriptor.get(); + if (ts.typeKind() == TypeDescKind.COMPILATION_ERROR && + typedBindingNode.typeDescriptor().kind() == SyntaxKind.VAR_TYPE_DESC) { + Types types = semanticModel.types(); + ts = types.builder().UNION_TYPE.withMemberTypes(types.ANY, types.ERROR).build(); + } + } + checkAndSetTypeResult(ts); + } } diff --git a/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/common/utils/SymbolUtil.java b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/common/utils/SymbolUtil.java index f8722526dded..991a4258ee3f 100644 --- a/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/common/utils/SymbolUtil.java +++ b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/common/utils/SymbolUtil.java @@ -462,7 +462,7 @@ public static List filterSymbolsByPrefix(List symbolList, CompletionSearchProvider completionSearchProvider = CompletionSearchProvider .getInstance(context.languageServercontext()); if (!completionSearchProvider.checkModuleIndexed(moduleId)) { - completionSearchProvider.indexModule(moduleId, symbolList.stream() + completionSearchProvider.indexModuleAndModuleSymbolNames(moduleId, symbolList.stream() .map(symbol -> symbol.getName().get()) .collect(Collectors.toList()), new ArrayList<>(symbolMapWithPrefix.keySet())); } diff --git a/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/CompletionSearchProvider.java b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/CompletionSearchProvider.java index 50396cc6b9e7..662c50d8ecd4 100644 --- a/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/CompletionSearchProvider.java +++ b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/CompletionSearchProvider.java @@ -70,10 +70,11 @@ public List getSuggestions(String prefix) { * @param moduleName module name. * @param stringList list of words. */ - public void indexModule(ModuleID moduleName, List stringList, List namesWithModulePrefix) { + public void indexModuleAndModuleSymbolNames(ModuleID moduleName, List stringList, + List namesWithModulePrefix) { indexedModules.add(moduleName); - stringList.forEach(s -> trie.root.insert(s.toLowerCase(Locale.ENGLISH))); - namesWithModulePrefix.forEach((s -> trie.root.insert(s.toLowerCase(Locale.ENGLISH)))); + indexNames(stringList); + indexNames(namesWithModulePrefix); } /** @@ -85,4 +86,13 @@ public void indexModule(ModuleID moduleName, List stringList, List names) { + names.forEach(s -> trie.root.insert(s.toLowerCase(Locale.ENGLISH))); + } } diff --git a/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/SpreadCompletionItem.java b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/SpreadCompletionItem.java new file mode 100644 index 000000000000..68192c53d382 --- /dev/null +++ b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/SpreadCompletionItem.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2023, WSO2 LLC. (http://wso2.com) All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.ballerinalang.langserver.completions; + +import io.ballerina.compiler.api.symbols.Symbol; +import org.ballerinalang.langserver.commons.BallerinaCompletionContext; +import org.ballerinalang.langserver.commons.completion.AbstractLSCompletionItem; +import org.eclipse.lsp4j.CompletionItem; + +import java.util.Optional; + +/** + * Represents a Spread Completion Item. + * Eg: ...varName + * + * @since 2201.8.0 + */ +public class SpreadCompletionItem extends AbstractLSCompletionItem { + private final Symbol expression; + + public SpreadCompletionItem(BallerinaCompletionContext context, CompletionItem completionItem, Symbol expression) { + super(context, completionItem, CompletionItemType.SPREAD); + this.expression = expression; + } + + public Optional getExpression() { + return Optional.ofNullable(expression); + } +} diff --git a/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/builder/SpreadFieldCompletionItemBuilder.java b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/builder/SpreadCompletionItemBuilder.java similarity index 94% rename from language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/builder/SpreadFieldCompletionItemBuilder.java rename to language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/builder/SpreadCompletionItemBuilder.java index 6838f9fdc4a2..39e6e25a8e52 100644 --- a/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/builder/SpreadFieldCompletionItemBuilder.java +++ b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/builder/SpreadCompletionItemBuilder.java @@ -33,9 +33,9 @@ * * @since 2201.1.1 */ -public class SpreadFieldCompletionItemBuilder { +public class SpreadCompletionItemBuilder { - private static final String SPREAD_OPERATOR = "..."; + public static final String SPREAD_OPERATOR = "..."; /** * Build the constant {@link CompletionItem}. @@ -46,7 +46,7 @@ public class SpreadFieldCompletionItemBuilder { */ public static CompletionItem build(Symbol symbol, String typeName, BallerinaCompletionContext context) { if (symbol.kind() == FUNCTION) { - return SpreadFieldCompletionItemBuilder.build((FunctionSymbol) symbol, typeName, context); + return SpreadCompletionItemBuilder.build((FunctionSymbol) symbol, typeName, context); } String symbolName = symbol.getName().orElseThrow(); String insertText = SPREAD_OPERATOR + symbolName; diff --git a/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/providers/context/ImportDeclarationNodeContext.java b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/providers/context/ImportDeclarationNodeContext.java index b111ccc32eb3..4c9895d52108 100644 --- a/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/providers/context/ImportDeclarationNodeContext.java +++ b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/providers/context/ImportDeclarationNodeContext.java @@ -36,6 +36,7 @@ import org.ballerinalang.langserver.commons.BallerinaCompletionContext; import org.ballerinalang.langserver.commons.LanguageServerContext; import org.ballerinalang.langserver.commons.completion.LSCompletionItem; +import org.ballerinalang.langserver.completions.CompletionSearchProvider; import org.ballerinalang.langserver.completions.SnippetCompletionItem; import org.ballerinalang.langserver.completions.providers.AbstractCompletionProvider; import org.ballerinalang.langserver.completions.util.Snippet; @@ -318,8 +319,25 @@ private ArrayList moduleNameContextCompletions(BallerinaComple ArrayList completionItems = new ArrayList<>(); List addedPkgNames = new ArrayList<>(); LanguageServerContext serverContext = context.languageServercontext(); - List moduleList = - LSPackageLoader.getInstance(serverContext).getAllVisiblePackages(context); + List moduleList; + + if (orgName.equals("ballerinax")) { + List packageList = new ArrayList<>(); + String prefix = node.moduleName().stream().filter(identifierToken -> !identifierToken.isMissing()) + .map(IdentifierToken::text) + .collect(Collectors.joining(".")); + + moduleList = LSPackageLoader.getInstance(serverContext).getCentralPackages(serverContext); + moduleList.forEach(ballerinaPackage -> packageList.add(ballerinaPackage.packageName().value())); + List filteredPackageNames = getFilteredPackages(packageList, prefix, context); + for (String filteredPackage : filteredPackageNames) { + LSCompletionItem completionItem = getImportCompletion(context, filteredPackage, filteredPackage); + completionItem.getCompletionItem().setAdditionalTextEdits(additionalEdits); + completionItems.add(completionItem); + } + return completionItems; + } + moduleList = LSPackageLoader.getInstance(serverContext).getAllVisiblePackages(context); moduleList.forEach(ballerinaPackage -> { String packageName = ballerinaPackage.packageName().value(); String insertText; @@ -332,7 +350,7 @@ private ArrayList moduleNameContextCompletions(BallerinaComple insertText = packageName; } addedPkgNames.add(packageName); - // Do not add the semi colon at the end of the insert text since the user might type the as keyword + // Do not add the semicolon at the end of the insert text since the user might type the as keyword LSCompletionItem completionItem = getImportCompletion(context, packageName, insertText); completionItem.getCompletionItem().setAdditionalTextEdits(additionalEdits); completionItems.add(completionItem); @@ -342,6 +360,15 @@ private ArrayList moduleNameContextCompletions(BallerinaComple return completionItems; } + + private static List getFilteredPackages(List packageList, String prefix, + BallerinaCompletionContext context) { + CompletionSearchProvider completionSearchProvider = CompletionSearchProvider + .getInstance(context.languageServercontext()); + completionSearchProvider.indexNames(packageList); + return completionSearchProvider.getSuggestions(prefix); + } + private boolean onSuggestAsKeyword(BallerinaCompletionContext context, ImportDeclarationNode node) { SeparatedNodeList moduleName = node.moduleName(); diff --git a/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/providers/context/ListConstructorExpressionNodeContext.java b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/providers/context/ListConstructorExpressionNodeContext.java index 2953bb536d5e..bf20faca5dfb 100644 --- a/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/providers/context/ListConstructorExpressionNodeContext.java +++ b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/providers/context/ListConstructorExpressionNodeContext.java @@ -15,22 +15,37 @@ */ package org.ballerinalang.langserver.completions.providers.context; +import io.ballerina.compiler.api.SemanticModel; +import io.ballerina.compiler.api.symbols.ArrayTypeSymbol; +import io.ballerina.compiler.api.symbols.FunctionSymbol; import io.ballerina.compiler.api.symbols.Symbol; +import io.ballerina.compiler.api.symbols.SymbolKind; +import io.ballerina.compiler.api.symbols.TypeDescKind; import io.ballerina.compiler.api.symbols.TypeSymbol; +import io.ballerina.compiler.api.symbols.VariableSymbol; import io.ballerina.compiler.syntax.tree.ListConstructorExpressionNode; import io.ballerina.compiler.syntax.tree.NonTerminalNode; import io.ballerina.compiler.syntax.tree.QualifiedNameReferenceNode; +import io.ballerina.compiler.syntax.tree.SyntaxKind; +import io.ballerina.projects.Document; import org.ballerinalang.annotation.JavaSPIService; +import org.ballerinalang.langserver.common.utils.NameUtil; +import org.ballerinalang.langserver.common.utils.PositionUtil; import org.ballerinalang.langserver.commons.BallerinaCompletionContext; import org.ballerinalang.langserver.commons.completion.LSCompletionException; import org.ballerinalang.langserver.commons.completion.LSCompletionItem; +import org.ballerinalang.langserver.completions.SpreadCompletionItem; +import org.ballerinalang.langserver.completions.builder.SpreadCompletionItemBuilder; import org.ballerinalang.langserver.completions.providers.AbstractCompletionProvider; import org.ballerinalang.langserver.completions.util.QNameRefCompletionUtil; import org.ballerinalang.langserver.completions.util.SortingUtil; +import org.eclipse.lsp4j.CompletionItem; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Optional; +import java.util.stream.Collectors; /** * Completion provider for {@link ListConstructorExpressionNode} context. @@ -55,15 +70,66 @@ public List getCompletions(BallerinaCompletionContext context, completionItems.addAll(this.getCompletionItemList(entries, context)); } else { completionItems.addAll(this.expressionCompletions(context)); + if (context.getNodeAtCursor().kind() != SyntaxKind.SPREAD_MEMBER) { + completionItems.addAll(this.spreadOperatorCompletions(context)); + } } this.sort(context, node, completionItems); return completionItems; } + private List spreadOperatorCompletions(BallerinaCompletionContext context) { + Optional semanticModel = context.currentSemanticModel(); + Optional document = context.currentDocument(); + if (semanticModel.isEmpty() || document.isEmpty()) { + return Collections.emptyList(); + } + Optional expectedType = semanticModel.get().expectedType(document.get(), + PositionUtil.getLinePosition(context.getCursorPosition())); + if (expectedType.isEmpty()) { + return Collections.emptyList(); + } + return context.visibleSymbols(context.getCursorPosition()).stream() + .filter(symbol -> { + if (symbol.getName().isEmpty()) { + return false; + } + TypeSymbol typeDescriptor; + if (symbol.kind() == SymbolKind.VARIABLE) { + typeDescriptor = ((VariableSymbol) symbol).typeDescriptor(); + if (typeDescriptor.typeKind() != TypeDescKind.ARRAY) { + return false; + } + } else if (symbol.kind() == SymbolKind.FUNCTION) { + Optional typeSymbol = ((FunctionSymbol) symbol).typeDescriptor() + .returnTypeDescriptor(); + if (typeSymbol.isEmpty()) { + return false; + } + typeDescriptor = typeSymbol.get(); + } else { + return false; + } + return typeDescriptor.typeKind() == TypeDescKind.ARRAY && + ((ArrayTypeSymbol) typeDescriptor).memberTypeDescriptor().subtypeOf(expectedType.get()); + }).map(symbol -> { + TypeSymbol typeDescriptor; + if (symbol.kind() == SymbolKind.VARIABLE) { + typeDescriptor = ((VariableSymbol) symbol).typeDescriptor(); + } else { + typeDescriptor = ((FunctionSymbol) symbol).typeDescriptor().returnTypeDescriptor().get(); + } + String typeName = NameUtil.getModifiedTypeName(context, typeDescriptor); + CompletionItem completionItem = + SpreadCompletionItemBuilder.build(symbol, typeName, context); + return new SpreadCompletionItem(context, completionItem, symbol); + }).collect(Collectors.toList()); + } + @Override public boolean onPreValidation(BallerinaCompletionContext context, ListConstructorExpressionNode node) { - return node.textRange().startOffset() <= context.getCursorPositionInTree() + return node.textRange().startOffset() <= context.getCursorPositionInTree() && context.getCursorPositionInTree() <= node.textRange().endOffset(); } @@ -76,6 +142,15 @@ public void sort(BallerinaCompletionContext context, ListConstructorExpressionNo if (contextType.isEmpty()) { // Added for safety. sortText = SortingUtil.genSortText(SortingUtil.toRank(context, lsCItem, 2)); + } else if (lsCItem.getType() == LSCompletionItem.CompletionItemType.SPREAD) { + Optional expression = ((SpreadCompletionItem) lsCItem).getExpression(); + //Default sort text of variable or function symbols + int lastRank = expression.map(expr -> expr.kind() == SymbolKind.FUNCTION ? 4 : 3) + .orElse(3); + //Set spread completion item sort text as the same of variable or function symbols + sortText = SortingUtil.genSortText(1) + + SortingUtil.genSortText(1) //Assignable + + SortingUtil.genSortText(lastRank); } else if (!SortingUtil.isTypeCompletionItem(lsCItem)) { /* Here the sort text is three-fold. @@ -89,7 +164,6 @@ Then we again append the sorting among the symbols (ex: functions over variable) } else { sortText = SortingUtil.genSortText(2) + SortingUtil.genSortText(SortingUtil.toRank(context, lsCItem)); } - lsCItem.getCompletionItem().setSortText(sortText); } } diff --git a/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/providers/context/MappingConstructorExpressionNodeContext.java b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/providers/context/MappingConstructorExpressionNodeContext.java index eac956bd0c27..0ff4a5b55122 100644 --- a/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/providers/context/MappingConstructorExpressionNodeContext.java +++ b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/providers/context/MappingConstructorExpressionNodeContext.java @@ -35,7 +35,7 @@ import org.ballerinalang.langserver.commons.BallerinaCompletionContext; import org.ballerinalang.langserver.commons.completion.LSCompletionException; import org.ballerinalang.langserver.commons.completion.LSCompletionItem; -import org.ballerinalang.langserver.completions.SymbolCompletionItem; +import org.ballerinalang.langserver.completions.SpreadCompletionItem; import org.ballerinalang.langserver.completions.util.QNameRefCompletionUtil; import org.ballerinalang.langserver.completions.util.SortingUtil; @@ -104,33 +104,33 @@ public void sort(BallerinaCompletionContext context, MappingConstructorExpressio } else { scope = Scope.OTHER; } - Optional contextType = context.getContextType(); if (contextType.isEmpty()) { super.sort(context, node, completionItems); return; } - completionItems.forEach(lsCItem -> { // In the field name context, we have to give a special consideration to the map type variables // suggested with the spread operator (...map1). - if (scope == Scope.FIELD_NAME && lsCItem.getType() == LSCompletionItem.CompletionItemType.SYMBOL) { - SymbolCompletionItem symbolCItem = (SymbolCompletionItem) lsCItem; - Optional mapTypeParam = symbolCItem.getSymbol() + if (scope == Scope.FIELD_NAME && lsCItem.getType() == LSCompletionItem.CompletionItemType.SPREAD) { + Optional expression = ((SpreadCompletionItem) lsCItem).getExpression(); + + Optional mapTypeParam = expression .flatMap(SymbolUtil::getTypeDescriptor) .filter(typeDesc -> typeDesc.typeKind() == TypeDescKind.MAP) .map(typeDesc -> (MapTypeSymbol) typeDesc) .map(MapTypeSymbol::typeParam); + // If the completion item is a map type variable and is the spread operator, we give it priority - if (mapTypeParam.isPresent() && mapTypeParam.get().subtypeOf(contextType.get()) - && lsCItem.getCompletionItem().getLabel().startsWith("...")) { - int rank = SortingUtil.toRank(context, lsCItem); - String sortText = SortingUtil.genSortText(1) + SortingUtil.genSortText(rank); + if ((mapTypeParam.isPresent() && mapTypeParam.get().subtypeOf(contextType.get())) + || expression.isPresent()) { + int lastRank = expression.map(expr -> expr.kind() == SymbolKind.FUNCTION ? 4 : 3) + .orElse(3); + String sortText = SortingUtil.genSortText(1) + SortingUtil.genSortText(lastRank); lsCItem.getCompletionItem().setSortText(sortText); return; } } - String sortText = SortingUtil.genSortTextByAssignability(context, lsCItem, contextType.get()); lsCItem.getCompletionItem().setSortText(sortText); }); @@ -168,7 +168,7 @@ protected List getFields(MappingConstructorExpressionNode node) { .map(field -> ((IdentifierToken) ((SpecificFieldNode) field).fieldName()).text()) .collect(Collectors.toList()); } - + private enum Scope { VALUE_EXPR, FIELD_NAME, diff --git a/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/providers/context/MappingContextProvider.java b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/providers/context/MappingContextProvider.java index 9aefbb555127..dce1a52dda3e 100644 --- a/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/providers/context/MappingContextProvider.java +++ b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/providers/context/MappingContextProvider.java @@ -41,8 +41,8 @@ import org.ballerinalang.langserver.commons.BallerinaCompletionContext; import org.ballerinalang.langserver.commons.completion.LSCompletionItem; import org.ballerinalang.langserver.completions.SnippetCompletionItem; -import org.ballerinalang.langserver.completions.SymbolCompletionItem; -import org.ballerinalang.langserver.completions.builder.SpreadFieldCompletionItemBuilder; +import org.ballerinalang.langserver.completions.SpreadCompletionItem; +import org.ballerinalang.langserver.completions.builder.SpreadCompletionItemBuilder; import org.ballerinalang.langserver.completions.providers.AbstractCompletionProvider; import org.ballerinalang.langserver.completions.util.QNameRefCompletionUtil; import org.ballerinalang.langserver.completions.util.Snippet; @@ -337,8 +337,8 @@ private List getSpreadFieldCompletionItemList(List sym String typeName = (typeDescriptor.isEmpty() || typeDescriptor.get().typeKind() == null) ? "" : NameUtil.getModifiedTypeName(ctx, typeDescriptor.get()); CompletionItem cItem; - cItem = SpreadFieldCompletionItemBuilder.build(symbol, typeName, ctx); - completionItems.add(new SymbolCompletionItem(ctx, symbol, cItem)); + cItem = SpreadCompletionItemBuilder.build(symbol, typeName, ctx); + completionItems.add(new SpreadCompletionItem(ctx, cItem, symbol)); processedSymbols.add(symbol); }); return completionItems; diff --git a/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/providers/context/TypeTestExpressionNodeContext.java b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/providers/context/TypeTestExpressionNodeContext.java index d53820503a47..3828e2b42a76 100644 --- a/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/providers/context/TypeTestExpressionNodeContext.java +++ b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/completions/providers/context/TypeTestExpressionNodeContext.java @@ -23,7 +23,10 @@ import io.ballerina.compiler.api.symbols.TypeReferenceTypeSymbol; import io.ballerina.compiler.api.symbols.TypeSymbol; import io.ballerina.compiler.api.symbols.UnionTypeSymbol; +import io.ballerina.compiler.syntax.tree.Node; import io.ballerina.compiler.syntax.tree.QualifiedNameReferenceNode; +import io.ballerina.compiler.syntax.tree.SimpleNameReferenceNode; +import io.ballerina.compiler.syntax.tree.SyntaxKind; import io.ballerina.compiler.syntax.tree.Token; import io.ballerina.compiler.syntax.tree.TypeTestExpressionNode; import io.ballerina.projects.Module; @@ -38,6 +41,7 @@ import org.ballerinalang.langserver.completions.TypeCompletionItem; import org.ballerinalang.langserver.completions.builder.TypeCompletionItemBuilder; import org.ballerinalang.langserver.completions.providers.AbstractCompletionProvider; +import org.ballerinalang.langserver.completions.util.CompletionUtil; import org.ballerinalang.langserver.completions.util.QNameRefCompletionUtil; import org.ballerinalang.langserver.completions.util.SortingUtil; @@ -68,6 +72,9 @@ public List getCompletions(BallerinaCompletionContext context, QualifiedNameReferenceNode qNameRef = (QualifiedNameReferenceNode) context.getNodeAtCursor(); List typesInModule = QNameRefCompletionUtil.getTypesInModule(context, qNameRef); completionItems.addAll(this.getCompletionItemList(typesInModule, context)); + } else if (isValidTypeName(node.typeDescriptor()) && + context.getCursorPosition().getCharacter() > node.typeDescriptor().lineRange().endLine().offset()) { + return CompletionUtil.route(context, node.parent()); } else { completionItems.addAll(this.getTypeDescContextItems(context)); completionItems.addAll(getModuleTypeDescCompletionsForExpression(context, node)); @@ -76,6 +83,13 @@ public List getCompletions(BallerinaCompletionContext context, return completionItems; } + + private boolean isValidTypeName(Node node) { + if (node.kind() == SyntaxKind.SIMPLE_NAME_REFERENCE) { + return !((SimpleNameReferenceNode) node).name().text().isEmpty(); + } + return true; + } private List getModuleTypeDescCompletionsForExpression(BallerinaCompletionContext context, TypeTestExpressionNode node) { 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 ac07b8a22804..a6a36bcacee3 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 @@ -47,6 +47,18 @@ public Object[][] dataProvider() { {"add_check_codeaction_config3.json"}, {"add_check_codeaction_config4.json"}, {"add_check_codeaction_config5.json"}, + {"add_check_codeaction_config6.json"}, + {"add_check_codeaction_config7.json"}, + {"add_check_codeaction_config8.json"}, + {"add_check_codeaction_config9.json"}, + {"add_check_codeaction_config10.json"}, + {"add_check_codeaction_config11.json"}, + {"add_check_codeaction_config12.json"}, + {"add_check_codeaction_config13.json"}, + {"add_check_codeaction_config14.json"}, + {"add_check_codeaction_config15.json"}, + {"add_check_codeaction_config16.json"}, + {"add_check_codeaction_config17.json"}, {"add_check_with_parantheses_config1.json"}, {"add_check_codeaction_wait_action_config1.json"}, {"add_check_codeaction_wait_action_config1.json"}, diff --git a/language-server/modules/langserver-core/src/test/java/org/ballerinalang/langserver/codeaction/CreateFunctionTest.java b/language-server/modules/langserver-core/src/test/java/org/ballerinalang/langserver/codeaction/CreateFunctionTest.java index 97032e3eca41..642cf73c205b 100644 --- a/language-server/modules/langserver-core/src/test/java/org/ballerinalang/langserver/codeaction/CreateFunctionTest.java +++ b/language-server/modules/langserver-core/src/test/java/org/ballerinalang/langserver/codeaction/CreateFunctionTest.java @@ -175,6 +175,14 @@ public Object[][] dataProvider() { {"create_function_in_local_var1.json"}, {"create_function_in_local_var2.json"}, {"create_function_in_start_action1.json"}, + + {"undefinedFunctionCodeAction25.json"}, + {"undefinedFunctionCodeAction26.json"}, + {"undefinedFunctionCodeAction27.json"}, + {"undefinedFunctionCodeAction28.json"}, + {"undefinedFunctionCodeAction29.json"}, + {"undefinedFunctionCodeAction30.json"}, + {"undefinedFunctionCodeAction31.json"}, }; } diff --git a/language-server/modules/langserver-core/src/test/java/org/ballerinalang/langserver/codeaction/CreateVariableWithPositionalRenameSupportCapabilityTest.java b/language-server/modules/langserver-core/src/test/java/org/ballerinalang/langserver/codeaction/CreateVariableWithPositionalRenameSupportCapabilityTest.java index ecd0a3be285e..6831dfd1a094 100644 --- a/language-server/modules/langserver-core/src/test/java/org/ballerinalang/langserver/codeaction/CreateVariableWithPositionalRenameSupportCapabilityTest.java +++ b/language-server/modules/langserver-core/src/test/java/org/ballerinalang/langserver/codeaction/CreateVariableWithPositionalRenameSupportCapabilityTest.java @@ -149,7 +149,14 @@ public Object[][] dataProvider() { {"createVariableWithCheck3.json"}, {"createVariableWithCheck4.json"}, {"createVariableWithCheck5.json"}, - {"createVariableWithCheck6.json"} + {"createVariableWithCheck6.json"}, + {"createVariableWithCheck7.json"}, + {"createVariableWithCheck8.json"}, + {"createVariableWithCheck9.json"}, + {"createVariableWithCheck10.json"}, + {"createVariableWithCheck11.json"}, + {"createVariableWithCheck12.json"}, + {"createVariableWithCheck13.json"} }; } diff --git a/language-server/modules/langserver-core/src/test/java/org/ballerinalang/langserver/extensions/symbol/ReoccurringTypesTest.java b/language-server/modules/langserver-core/src/test/java/org/ballerinalang/langserver/extensions/symbol/ReoccurringTypesTest.java new file mode 100644 index 000000000000..3f1dca56ff60 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/java/org/ballerinalang/langserver/extensions/symbol/ReoccurringTypesTest.java @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2023, WSO2 LLC. (http://wso2.com) All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.ballerinalang.langserver.extensions.symbol; + +import io.ballerina.tools.text.LinePosition; +import org.ballerinalang.diagramutil.connector.models.connector.Type; +import org.ballerinalang.diagramutil.connector.models.connector.types.ArrayType; +import org.ballerinalang.diagramutil.connector.models.connector.types.RecordType; +import org.ballerinalang.diagramutil.connector.models.connector.types.UnionType; +import org.ballerinalang.langserver.extensions.LSExtensionTestUtil; +import org.ballerinalang.langserver.extensions.ballerina.symbol.ResolvedTypeForSymbol; +import org.ballerinalang.langserver.extensions.ballerina.symbol.TypesFromSymbolResponse; +import org.ballerinalang.langserver.util.FileUtils; +import org.ballerinalang.langserver.util.TestUtil; +import org.eclipse.lsp4j.jsonrpc.Endpoint; +import org.testng.Assert; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +import java.io.IOException; +import java.net.URI; +import java.nio.file.Path; +import java.util.concurrent.ExecutionException; + +/** + * Test type info generated for types records which are having reoccurring types. + */ +public class ReoccurringTypesTest { + private Endpoint serviceEndpoint; + + private final Path reoccurringTypesBalFile = FileUtils.RES_DIR.resolve("extensions") + .resolve("symbol") + .resolve("reoccurringTypes.bal"); + + @BeforeClass + public void startLangServer() { + this.serviceEndpoint = TestUtil.initializeLanguageSever(); + } + + @Test(description = "types that are reoccurring in the same record") + public void testReoccurringTypes() + throws IOException, ExecutionException, InterruptedException { + Path inputFile = LSExtensionTestUtil.createTempFile(reoccurringTypesBalFile); + URI uri = URI.create(inputFile.toUri().toString()); + TestUtil.openDocument(serviceEndpoint, inputFile); + + LinePosition fnPosition = LinePosition.from(13, 9); + LinePosition returnTypeDescPosition = LinePosition.from(13, 37); + + TypesFromSymbolResponse typesResponse = LSExtensionTestUtil.getTypesFromFnDefinition( + uri, fnPosition, returnTypeDescPosition, this.serviceEndpoint); + + Assert.assertNotNull(typesResponse.getTypes()); + + ResolvedTypeForSymbol returnType = typesResponse.getTypes().get(0); + Assert.assertEquals(returnType.getType().typeName, SymbolServiceTestUtil.RECORD); + + Assert.assertTrue(returnType.getType() instanceof RecordType); + RecordType recordType = (RecordType) returnType.getType(); + Assert.assertEquals(recordType.fields.size(), 4); + + Assert.assertEquals(recordType.fields.get(0).name, "field1"); + Assert.assertEquals(recordType.fields.get(0).typeName, SymbolServiceTestUtil.ARRAY); + Assert.assertTrue(recordType.fields.get(0).isOptional()); + ArrayType arrayType0 = (ArrayType) recordType.fields.get(0); + assertIntOrStringType(arrayType0.memberType); + + Assert.assertEquals(recordType.fields.get(1).name, "field2"); + Assert.assertEquals(recordType.fields.get(1).typeName, SymbolServiceTestUtil.ARRAY); + Assert.assertTrue(recordType.fields.get(1).isOptional()); + ArrayType arrayType1 = (ArrayType) recordType.fields.get(1); + assertIntOrStringType(arrayType1.memberType); + + Assert.assertEquals(recordType.fields.get(2).name, "rec1"); + assertRecAType(recordType.fields.get(2)); + + Assert.assertEquals(recordType.fields.get(3).name, "rec2"); + assertRecAType(recordType.fields.get(3)); + + TestUtil.closeDocument(this.serviceEndpoint, inputFile); + } + + private void assertIntOrStringType(Type type) { + Assert.assertEquals(type.typeName, SymbolServiceTestUtil.UNION); + UnionType unionType = (UnionType) type; + Assert.assertEquals(unionType.name, "IntOrString"); + Assert.assertFalse(unionType.isRestType); + Assert.assertEquals(unionType.members.size(), 2); + Assert.assertEquals(unionType.members.get(0).typeName, SymbolServiceTestUtil.INTEGER); + Assert.assertEquals(unionType.members.get(1).typeName, SymbolServiceTestUtil.STRING); + } + + private void assertRecAType(Type type) { + Assert.assertEquals(type.typeName, SymbolServiceTestUtil.RECORD); + Assert.assertTrue(type.isOptional()); + RecordType recordType = (RecordType) type; + Assert.assertEquals(recordType.fields.size(), 1); + Assert.assertEquals(recordType.fields.get(0).name, "name"); + Assert.assertEquals(recordType.fields.get(0).typeName, SymbolServiceTestUtil.STRING); + } +} diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/config/add_check_codeaction_config10.json b/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/config/add_check_codeaction_config10.json new file mode 100644 index 000000000000..8022b70465b0 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/config/add_check_codeaction_config10.json @@ -0,0 +1,42 @@ +{ + "position": { + "line": 41, + "character": 24 + }, + "source": "add_check_codeaction_source5.bal", + "expected": [ + { + "title": "Add 'check' error", + "kind": "quickfix", + "edits": [ + { + "range": { + "start": { + "line": 41, + "character": 17 + }, + "end": { + "line": 41, + "character": 17 + } + }, + "newText": "check " + }, + { + "range": { + "start": { + "line": 39, + "character": 32 + }, + "end": { + "line": 39, + "character": 47 + } + }, + "newText": "returns Error1|Error2?" + } + ], + "resolvable": false + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/config/add_check_codeaction_config11.json b/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/config/add_check_codeaction_config11.json new file mode 100644 index 000000000000..1ab3298bff52 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/config/add_check_codeaction_config11.json @@ -0,0 +1,42 @@ +{ + "position": { + "line": 42, + "character": 24 + }, + "source": "add_check_codeaction_source5.bal", + "expected": [ + { + "title": "Add 'check' error", + "kind": "quickfix", + "edits": [ + { + "range": { + "start": { + "line": 42, + "character": 17 + }, + "end": { + "line": 42, + "character": 17 + } + }, + "newText": "check " + }, + { + "range": { + "start": { + "line": 39, + "character": 32 + }, + "end": { + "line": 39, + "character": 47 + } + }, + "newText": "returns Error1|Error2?" + } + ], + "resolvable": false + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/config/add_check_codeaction_config12.json b/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/config/add_check_codeaction_config12.json new file mode 100644 index 000000000000..cd7159c96ee0 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/config/add_check_codeaction_config12.json @@ -0,0 +1,42 @@ +{ + "position": { + "line": 43, + "character": 24 + }, + "source": "add_check_codeaction_source5.bal", + "expected": [ + { + "title": "Add 'check' error", + "kind": "quickfix", + "edits": [ + { + "range": { + "start": { + "line": 43, + "character": 17 + }, + "end": { + "line": 43, + "character": 17 + } + }, + "newText": "check " + }, + { + "range": { + "start": { + "line": 39, + "character": 32 + }, + "end": { + "line": 39, + "character": 47 + } + }, + "newText": "returns Error1|Error2?" + } + ], + "resolvable": false + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/config/add_check_codeaction_config13.json b/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/config/add_check_codeaction_config13.json new file mode 100644 index 000000000000..4240889d6205 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/config/add_check_codeaction_config13.json @@ -0,0 +1,42 @@ +{ + "position": { + "line": 48, + "character": 24 + }, + "source": "add_check_codeaction_source5.bal", + "expected": [ + { + "title": "Add 'check' error", + "kind": "quickfix", + "edits": [ + { + "range": { + "start": { + "line": 48, + "character": 20 + }, + "end": { + "line": 48, + "character": 20 + } + }, + "newText": "check " + }, + { + "range": { + "start": { + "line": 47, + "character": 27 + }, + "end": { + "line": 47, + "character": 42 + } + }, + "newText": "returns Error1|Error2?" + } + ], + "resolvable": false + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/config/add_check_codeaction_config14.json b/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/config/add_check_codeaction_config14.json new file mode 100644 index 000000000000..ba91cd4033a6 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/config/add_check_codeaction_config14.json @@ -0,0 +1,42 @@ +{ + "position": { + "line": 53, + "character": 26 + }, + "source": "add_check_codeaction_source5.bal", + "expected": [ + { + "title": "Add 'check' error", + "kind": "quickfix", + "edits": [ + { + "range": { + "start": { + "line": 53, + "character": 20 + }, + "end": { + "line": 53, + "character": 20 + } + }, + "newText": "check " + }, + { + "range": { + "start": { + "line": 51, + "character": 27 + }, + "end": { + "line": 51, + "character": 42 + } + }, + "newText": "returns Error1|Error2?" + } + ], + "resolvable": false + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/config/add_check_codeaction_config15.json b/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/config/add_check_codeaction_config15.json new file mode 100644 index 000000000000..9cbfb56a3898 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/config/add_check_codeaction_config15.json @@ -0,0 +1,42 @@ +{ + "position": { + "line": 60, + "character": 28 + }, + "source": "add_check_codeaction_source5.bal", + "expected": [ + { + "title": "Add 'check' error", + "kind": "quickfix", + "edits": [ + { + "range": { + "start": { + "line": 60, + "character": 24 + }, + "end": { + "line": 60, + "character": 24 + } + }, + "newText": "check " + }, + { + "range": { + "start": { + "line": 59, + "character": 44 + }, + "end": { + "line": 59, + "character": 59 + } + }, + "newText": "returns Error1|Error2?" + } + ], + "resolvable": false + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/config/add_check_codeaction_config16.json b/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/config/add_check_codeaction_config16.json new file mode 100644 index 000000000000..c904f39e4e5e --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/config/add_check_codeaction_config16.json @@ -0,0 +1,42 @@ +{ + "position": { + "line": 66, + "character": 28 + }, + "source": "add_check_codeaction_source5.bal", + "expected": [ + { + "title": "Add 'check' error", + "kind": "quickfix", + "edits": [ + { + "range": { + "start": { + "line": 66, + "character": 24 + }, + "end": { + "line": 66, + "character": 24 + } + }, + "newText": "check " + }, + { + "range": { + "start": { + "line": 65, + "character": 44 + }, + "end": { + "line": 65, + "character": 59 + } + }, + "newText": "returns Error1|Error2?" + } + ], + "resolvable": false + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/config/add_check_codeaction_config17.json b/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/config/add_check_codeaction_config17.json new file mode 100644 index 000000000000..79d719c32cb8 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/config/add_check_codeaction_config17.json @@ -0,0 +1,42 @@ +{ + "position": { + "line": 86, + "character": 24 + }, + "source": "add_check_codeaction_source5.bal", + "expected": [ + { + "title": "Add 'check' error", + "kind": "quickfix", + "edits": [ + { + "range": { + "start": { + "line": 86, + "character": 20 + }, + "end": { + "line": 86, + "character": 20 + } + }, + "newText": "check " + }, + { + "range": { + "start": { + "line": 85, + "character": 42 + }, + "end": { + "line": 85, + "character": 57 + } + }, + "newText": "returns Error1|Error2?" + } + ], + "resolvable": false + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/config/add_check_codeaction_config6.json b/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/config/add_check_codeaction_config6.json new file mode 100644 index 000000000000..e009bdc8271d --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/config/add_check_codeaction_config6.json @@ -0,0 +1,42 @@ +{ + "position": { + "line": 24, + "character": 20 + }, + "source": "add_check_codeaction_source5.bal", + "expected": [ + { + "title": "Add 'check' error", + "kind": "quickfix", + "edits": [ + { + "range": { + "start": { + "line": 24, + "character": 16 + }, + "end": { + "line": 24, + "character": 16 + } + }, + "newText": "check " + }, + { + "range": { + "start": { + "line": 23, + "character": 32 + }, + "end": { + "line": 23, + "character": 47 + } + }, + "newText": "returns Error1|Error2?" + } + ], + "resolvable": false + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/config/add_check_codeaction_config7.json b/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/config/add_check_codeaction_config7.json new file mode 100644 index 000000000000..e7bf21e1b5c9 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/config/add_check_codeaction_config7.json @@ -0,0 +1,29 @@ +{ + "position": { + "line": 28, + "character": 19 + }, + "source": "add_check_codeaction_source5.bal", + "expected": [ + { + "title": "Add 'check' error", + "kind": "quickfix", + "edits": [ + { + "range": { + "start": { + "line": 28, + "character": 16 + }, + "end": { + "line": 28, + "character": 16 + } + }, + "newText": "check " + } + ], + "resolvable": false + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/config/add_check_codeaction_config8.json b/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/config/add_check_codeaction_config8.json new file mode 100644 index 000000000000..0e4b15cce9f2 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/config/add_check_codeaction_config8.json @@ -0,0 +1,42 @@ +{ + "position": { + "line": 32, + "character": 20 + }, + "source": "add_check_codeaction_source5.bal", + "expected": [ + { + "title": "Add 'check' error", + "kind": "quickfix", + "edits": [ + { + "range": { + "start": { + "line": 32, + "character": 16 + }, + "end": { + "line": 32, + "character": 16 + } + }, + "newText": "check " + }, + { + "range": { + "start": { + "line": 31, + "character": 32 + }, + "end": { + "line": 31, + "character": 47 + } + }, + "newText": "returns Error1|Error2?" + } + ], + "resolvable": false + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/config/add_check_codeaction_config9.json b/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/config/add_check_codeaction_config9.json new file mode 100644 index 000000000000..138eb06bbafa --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/config/add_check_codeaction_config9.json @@ -0,0 +1,42 @@ +{ + "position": { + "line": 36, + "character": 21 + }, + "source": "add_check_codeaction_source5.bal", + "expected": [ + { + "title": "Add 'check' error", + "kind": "quickfix", + "edits": [ + { + "range": { + "start": { + "line": 36, + "character": 16 + }, + "end": { + "line": 36, + "character": 16 + } + }, + "newText": "check " + }, + { + "range": { + "start": { + "line": 35, + "character": 31 + }, + "end": { + "line": 35, + "character": 31 + } + }, + "newText": " returns Error1|Error2?" + } + ], + "resolvable": false + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/source/add_check_codeaction_source5.bal b/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/source/add_check_codeaction_source5.bal new file mode 100644 index 000000000000..231607857c2f --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/add-check/source/add_check_codeaction_source5.bal @@ -0,0 +1,89 @@ +public type ErrorDetail1 record {| + string cause; + int code; +|}; + +public type ErrorDetail2 record {| + string code; +|}; + +public type ErrorDetail3 record {| + string code; +|}; + +public type Error1 distinct error; + +public type Error2 distinct error; + +public type Error3 distinct Error1; + +public function getInt() returns int|Error1|Error2|Error3 { + return 10; +} + +public function testFunction1() returns Error1? { + int value = getInt(); +} + +public function testFunction2() returns error? { + int value = getInt(); +} + +public function testFunction3() returns Error3? { + int value = getInt(); +} + +public function testFunction4() { + int value = getInt(); +} + +public function testFunction5() returns Error3? { + MyClient cl = new; + int value1 = cl.method1(); + int value2 = cl->remoteMethod1(); + int value3 = cl->/resource1; +} + +class TestClass { + function testMethod1() returns Error3? { + int value = getInt(); + } + + function testMethod2() returns Error1? { + MyClient cl = new; + int value = cl.method1(); + } +} + +public function testFunction6() { + var obj1 = client object { + resource function get testMethod1() returns Error1? { + int value = getInt(); + } + }; + + var obj2 = service object { + resource function get testMethod2() returns Error1? { + int value = getInt(); + } + }; +} + +client class MyClient { + + function method1() returns int|Error1|Error2|Error3 { + return 1; + } + + remote function remoteMethod1() returns int|Error1|Error2|Error3 { + return 1; + } + + resource function get resource1() returns int|Error1|Error2|Error3 { + return 1; + } + + resource function get testResource1() returns Error3? { + int value = getInt(); + } +} diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/create-function/config/undefinedFunctionCodeAction25.json b/language-server/modules/langserver-core/src/test/resources/codeaction/create-function/config/undefinedFunctionCodeAction25.json new file mode 100644 index 000000000000..b8cb0fef87b2 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/create-function/config/undefinedFunctionCodeAction25.json @@ -0,0 +1,57 @@ +{ + "position": { + "line": 1, + "character": 52 + }, + "source": "createUndefinedFunction14.bal", + "expected": [ + { + "title": "Create function 'toUpperCase(...)'", + "kind": "quickfix", + "edits": [ + { + "range": { + "start": { + "line": 2, + "character": 1 + }, + "end": { + "line": 2, + "character": 1 + } + }, + "newText": "\n\nfunction toUpperCase(string letter) returns any|error {\n return ;\n}" + } + ], + "resolvable": true, + "data": { + "extName": "org.ballerinalang.langserver.codeaction.BallerinaCodeActionExtension", + "codeActionName": "Create Function", + "fileUri": "createUndefinedFunction14.bal", + "range": { + "start": { + "line": 1, + "character": 46 + }, + "end": { + "line": 1, + "character": 65 + } + }, + "actionData": { + "key": "node.range", + "value": { + "start": { + "line": 1.0, + "character": 46.0 + }, + "end": { + "line": 1.0, + "character": 65.0 + } + } + } + } + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/create-function/config/undefinedFunctionCodeAction26.json b/language-server/modules/langserver-core/src/test/resources/codeaction/create-function/config/undefinedFunctionCodeAction26.json new file mode 100644 index 000000000000..65e8f55b6101 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/create-function/config/undefinedFunctionCodeAction26.json @@ -0,0 +1,57 @@ +{ + "position": { + "line": 1, + "character": 54 + }, + "source": "createUndefinedFunction15.bal", + "expected": [ + { + "title": "Create function 'toUpperCase(...)'", + "kind": "quickfix", + "edits": [ + { + "range": { + "start": { + "line": 2, + "character": 1 + }, + "end": { + "line": 2, + "character": 1 + } + }, + "newText": "\n\nfunction toUpperCase(string letter) returns int {\n return 0;\n}" + } + ], + "resolvable": true, + "data": { + "extName": "org.ballerinalang.langserver.codeaction.BallerinaCodeActionExtension", + "codeActionName": "Create Function", + "fileUri": "createUndefinedFunction15.bal", + "range": { + "start": { + "line": 1, + "character": 48 + }, + "end": { + "line": 1, + "character": 67 + } + }, + "actionData": { + "key": "node.range", + "value": { + "start": { + "line": 1.0, + "character": 48.0 + }, + "end": { + "line": 1.0, + "character": 67.0 + } + } + } + } + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/create-function/config/undefinedFunctionCodeAction27.json b/language-server/modules/langserver-core/src/test/resources/codeaction/create-function/config/undefinedFunctionCodeAction27.json new file mode 100644 index 000000000000..f1e970211618 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/create-function/config/undefinedFunctionCodeAction27.json @@ -0,0 +1,57 @@ +{ + "position": { + "line": 1, + "character": 18 + }, + "source": "createUndefinedFunction16.bal", + "expected": [ + { + "title": "Create function 'toUpperCase(...)'", + "kind": "quickfix", + "edits": [ + { + "range": { + "start": { + "line": 2, + "character": 1 + }, + "end": { + "line": 2, + "character": 1 + } + }, + "newText": "\n\nfunction toUpperCase(any a) returns any|error {\n return ;\n}" + } + ], + "resolvable": true, + "data": { + "extName": "org.ballerinalang.langserver.codeaction.BallerinaCodeActionExtension", + "codeActionName": "Create Function", + "fileUri": "createUndefinedFunction16.bal", + "range": { + "start": { + "line": 1, + "character": 11 + }, + "end": { + "line": 1, + "character": 30 + } + }, + "actionData": { + "key": "node.range", + "value": { + "start": { + "line": 1.0, + "character": 11.0 + }, + "end": { + "line": 1.0, + "character": 30.0 + } + } + } + } + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/create-function/config/undefinedFunctionCodeAction28.json b/language-server/modules/langserver-core/src/test/resources/codeaction/create-function/config/undefinedFunctionCodeAction28.json new file mode 100644 index 000000000000..58e5fc323303 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/create-function/config/undefinedFunctionCodeAction28.json @@ -0,0 +1,57 @@ +{ + "position": { + "line": 0, + "character": 16 + }, + "source": "createUndefinedFunction17.bal", + "expected": [ + { + "title": "Create function 'toUpperCase(...)'", + "kind": "quickfix", + "edits": [ + { + "range": { + "start": { + "line": 0, + "character": 28 + }, + "end": { + "line": 0, + "character": 28 + } + }, + "newText": "\n\nfunction toUpperCase(any a) returns any|error {\n return ;\n}" + } + ], + "resolvable": true, + "data": { + "extName": "org.ballerinalang.langserver.codeaction.BallerinaCodeActionExtension", + "codeActionName": "Create Function", + "fileUri": "createUndefinedFunction17.bal", + "range": { + "start": { + "line": 0, + "character": 8 + }, + "end": { + "line": 0, + "character": 27 + } + }, + "actionData": { + "key": "node.range", + "value": { + "start": { + "line": 0.0, + "character": 8.0 + }, + "end": { + "line": 0.0, + "character": 27.0 + } + } + } + } + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/create-function/config/undefinedFunctionCodeAction29.json b/language-server/modules/langserver-core/src/test/resources/codeaction/create-function/config/undefinedFunctionCodeAction29.json new file mode 100644 index 000000000000..c4a369e73a1d --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/create-function/config/undefinedFunctionCodeAction29.json @@ -0,0 +1,57 @@ +{ + "position": { + "line": 0, + "character": 50 + }, + "source": "createUndefinedFunction18.bal", + "expected": [ + { + "title": "Create function 'toUpperCase(...)'", + "kind": "quickfix", + "edits": [ + { + "range": { + "start": { + "line": 0, + "character": 64 + }, + "end": { + "line": 0, + "character": 64 + } + }, + "newText": "\n\nfunction toUpperCase(string letter) returns int {\n return 0;\n}" + } + ], + "resolvable": true, + "data": { + "extName": "org.ballerinalang.langserver.codeaction.BallerinaCodeActionExtension", + "codeActionName": "Create Function", + "fileUri": "createUndefinedFunction18.bal", + "range": { + "start": { + "line": 0, + "character": 44 + }, + "end": { + "line": 0, + "character": 63 + } + }, + "actionData": { + "key": "node.range", + "value": { + "start": { + "line": 0.0, + "character": 44.0 + }, + "end": { + "line": 0.0, + "character": 63.0 + } + } + } + } + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/create-function/config/undefinedFunctionCodeAction30.json b/language-server/modules/langserver-core/src/test/resources/codeaction/create-function/config/undefinedFunctionCodeAction30.json new file mode 100644 index 000000000000..ca672557e38c --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/create-function/config/undefinedFunctionCodeAction30.json @@ -0,0 +1,57 @@ +{ + "position": { + "line": 0, + "character": 51 + }, + "source": "createUndefinedFunction19.bal", + "expected": [ + { + "title": "Create function 'toUpperCase(...)'", + "kind": "quickfix", + "edits": [ + { + "range": { + "start": { + "line": 0, + "character": 62 + }, + "end": { + "line": 0, + "character": 62 + } + }, + "newText": "\n\nfunction toUpperCase(string letter) returns any|error {\n return ;\n}" + } + ], + "resolvable": true, + "data": { + "extName": "org.ballerinalang.langserver.codeaction.BallerinaCodeActionExtension", + "codeActionName": "Create Function", + "fileUri": "createUndefinedFunction19.bal", + "range": { + "start": { + "line": 0, + "character": 42 + }, + "end": { + "line": 0, + "character": 61 + } + }, + "actionData": { + "key": "node.range", + "value": { + "start": { + "line": 0.0, + "character": 42.0 + }, + "end": { + "line": 0.0, + "character": 61.0 + } + } + } + } + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/create-function/config/undefinedFunctionCodeAction31.json b/language-server/modules/langserver-core/src/test/resources/codeaction/create-function/config/undefinedFunctionCodeAction31.json new file mode 100644 index 000000000000..340dbc35887d --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/create-function/config/undefinedFunctionCodeAction31.json @@ -0,0 +1,57 @@ +{ + "position": { + "line": 6, + "character": 22 + }, + "source": "createUndefinedFunction20.bal", + "expected": [ + { + "title": "Create function 'foo(...)'", + "kind": "quickfix", + "edits": [ + { + "range": { + "start": { + "line": 7, + "character": 1 + }, + "end": { + "line": 7, + "character": 1 + } + }, + "newText": "\n\nfunction foo(string letter) returns MyType {\n return {value: \"\"};\n}" + } + ], + "resolvable": true, + "data": { + "extName": "org.ballerinalang.langserver.codeaction.BallerinaCodeActionExtension", + "codeActionName": "Create Function", + "fileUri": "createUndefinedFunction20.bal", + "range": { + "start": { + "line": 6, + "character": 19 + }, + "end": { + "line": 6, + "character": 30 + } + }, + "actionData": { + "key": "node.range", + "value": { + "start": { + "line": 6.0, + "character": 19.0 + }, + "end": { + "line": 6.0, + "character": 30.0 + } + } + } + } + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/create-function/source/createUndefinedFunction14.bal b/language-server/modules/langserver-core/src/test/resources/codeaction/create-function/source/createUndefinedFunction14.bal new file mode 100644 index 000000000000..d27a2d100920 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/create-function/source/createUndefinedFunction14.bal @@ -0,0 +1,3 @@ +function func() { + var x = from var letter in "Saman" select toUpperCase(letter); +} diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/create-function/source/createUndefinedFunction15.bal b/language-server/modules/langserver-core/src/test/resources/codeaction/create-function/source/createUndefinedFunction15.bal new file mode 100644 index 000000000000..b897efdcbfe8 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/create-function/source/createUndefinedFunction15.bal @@ -0,0 +1,3 @@ +function func() { + int[] x = from var letter in "Saman" select toUpperCase(letter); +} diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/create-function/source/createUndefinedFunction16.bal b/language-server/modules/langserver-core/src/test/resources/codeaction/create-function/source/createUndefinedFunction16.bal new file mode 100644 index 000000000000..c2398b9f66a5 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/create-function/source/createUndefinedFunction16.bal @@ -0,0 +1,3 @@ +function func() { + var x = toUpperCase(letter); +} diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/create-function/source/createUndefinedFunction17.bal b/language-server/modules/langserver-core/src/test/resources/codeaction/create-function/source/createUndefinedFunction17.bal new file mode 100644 index 000000000000..49d616fd023a --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/create-function/source/createUndefinedFunction17.bal @@ -0,0 +1 @@ +var x = toUpperCase(letter); diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/create-function/source/createUndefinedFunction18.bal b/language-server/modules/langserver-core/src/test/resources/codeaction/create-function/source/createUndefinedFunction18.bal new file mode 100644 index 000000000000..e887146d9100 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/create-function/source/createUndefinedFunction18.bal @@ -0,0 +1 @@ +int[] x = from var letter in "Saman" select toUpperCase(letter); diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/create-function/source/createUndefinedFunction19.bal b/language-server/modules/langserver-core/src/test/resources/codeaction/create-function/source/createUndefinedFunction19.bal new file mode 100644 index 000000000000..b78e95695c71 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/create-function/source/createUndefinedFunction19.bal @@ -0,0 +1 @@ +var x = from var letter in "Saman" select toUpperCase(letter); diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/create-function/source/createUndefinedFunction20.bal b/language-server/modules/langserver-core/src/test/resources/codeaction/create-function/source/createUndefinedFunction20.bal new file mode 100644 index 000000000000..d1dc0a649717 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/create-function/source/createUndefinedFunction20.bal @@ -0,0 +1,8 @@ +type MyType record {| + string value; +|}; + +function func() { + stream streamName = stream from string letter in "JohnSnow" + select foo(letter); +} \ No newline at end of file diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/create-variable/config-rename-positional-capability/createVariableWithCheck10.json b/language-server/modules/langserver-core/src/test/resources/codeaction/create-variable/config-rename-positional-capability/createVariableWithCheck10.json new file mode 100644 index 000000000000..b51c5e8de3b4 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/create-variable/config-rename-positional-capability/createVariableWithCheck10.json @@ -0,0 +1,67 @@ +{ + "position": { + "line": 21, + "character": 17 + }, + "source": "testproject/modules/module3/module3.bal", + "description": "Add multiple error types to return", + "expected": [ + { + "title": "Create variable and check error", + "kind": "quickfix", + "edits": [ + { + "range": { + "start": { + "line": 21, + "character": 4 + }, + "end": { + "line": 21, + "character": 4 + } + }, + "newText": "int int2 = " + }, + { + "range": { + "start": { + "line": 21, + "character": 4 + }, + "end": { + "line": 21, + "character": 4 + } + }, + "newText": "check " + }, + { + "range": { + "start": { + "line": 20, + "character": 32 + }, + "end": { + "line": 20, + "character": 55 + } + }, + "newText": "returns module4:Error2|module4:Error1?" + } + ], + "command": { + "title": "Rename variable", + "command": "ballerina.action.positional.rename", + "arguments": [ + "testproject/modules/module3/module3.bal", + { + "line": 21, + "character": 8 + } + ] + }, + "resolvable": false + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/create-variable/config-rename-positional-capability/createVariableWithCheck11.json b/language-server/modules/langserver-core/src/test/resources/codeaction/create-variable/config-rename-positional-capability/createVariableWithCheck11.json new file mode 100644 index 000000000000..cbd620dac524 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/create-variable/config-rename-positional-capability/createVariableWithCheck11.json @@ -0,0 +1,67 @@ +{ + "position": { + "line": 25, + "character": 17 + }, + "source": "testproject/modules/module3/module3.bal", + "description": "Add multiple error types to return", + "expected": [ + { + "title": "Create variable and check error", + "kind": "quickfix", + "edits": [ + { + "range": { + "start": { + "line": 25, + "character": 4 + }, + "end": { + "line": 25, + "character": 4 + } + }, + "newText": "int int1 = " + }, + { + "range": { + "start": { + "line": 25, + "character": 4 + }, + "end": { + "line": 25, + "character": 4 + } + }, + "newText": "check " + }, + { + "range": { + "start": { + "line": 24, + "character": 32 + }, + "end": { + "line": 24, + "character": 55 + } + }, + "newText": "returns module4:Error1|module4:Error2?" + } + ], + "command": { + "title": "Rename variable", + "command": "ballerina.action.positional.rename", + "arguments": [ + "testproject/modules/module3/module3.bal", + { + "line": 25, + "character": 8 + } + ] + }, + "resolvable": false + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/create-variable/config-rename-positional-capability/createVariableWithCheck12.json b/language-server/modules/langserver-core/src/test/resources/codeaction/create-variable/config-rename-positional-capability/createVariableWithCheck12.json new file mode 100644 index 000000000000..1e7cc0feab30 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/create-variable/config-rename-positional-capability/createVariableWithCheck12.json @@ -0,0 +1,80 @@ +{ + "position": { + "line": 29, + "character": 17 + }, + "source": "testproject/modules/module3/module3.bal", + "description": "Add multiple error types to return with import statement", + "expected": [ + { + "title": "Create variable and check error", + "kind": "quickfix", + "edits": [ + { + "range": { + "start": { + "line": 29, + "character": 4 + }, + "end": { + "line": 29, + "character": 4 + } + }, + "newText": "int int3 = " + }, + { + "range": { + "start": { + "line": 29, + "character": 4 + }, + "end": { + "line": 29, + "character": 4 + } + }, + "newText": "check " + }, + { + "range": { + "start": { + "line": 28, + "character": 31 + }, + "end": { + "line": 28, + "character": 31 + } + }, + "newText": " returns module1:ErrorOne|module1:ErrorTwo?" + }, + { + "range": { + "start": { + "line": 0, + "character": 0 + }, + "end": { + "line": 0, + "character": 0 + } + }, + "newText": "import ballerina/module1;\n" + } + ], + "command": { + "title": "Rename variable", + "command": "ballerina.action.positional.rename", + "arguments": [ + "testproject/modules/module3/module3.bal", + { + "line": 30, + "character": 8 + } + ] + }, + "resolvable": false + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/create-variable/config-rename-positional-capability/createVariableWithCheck13.json b/language-server/modules/langserver-core/src/test/resources/codeaction/create-variable/config-rename-positional-capability/createVariableWithCheck13.json new file mode 100644 index 000000000000..aa5312f916c4 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/create-variable/config-rename-positional-capability/createVariableWithCheck13.json @@ -0,0 +1,67 @@ +{ + "position": { + "line": 33, + "character": 17 + }, + "source": "testproject/modules/module3/module3.bal", + "description": "Add multiple error types to return with import statment", + "expected": [ + { + "title": "Create variable and check error", + "kind": "quickfix", + "edits": [ + { + "range": { + "start": { + "line": 33, + "character": 4 + }, + "end": { + "line": 33, + "character": 4 + } + }, + "newText": "int int3 = " + }, + { + "range": { + "start": { + "line": 33, + "character": 4 + }, + "end": { + "line": 33, + "character": 4 + } + }, + "newText": "check " + }, + { + "range": { + "start": { + "line": 0, + "character": 0 + }, + "end": { + "line": 0, + "character": 0 + } + }, + "newText": "import ballerina/module1;\n" + } + ], + "command": { + "title": "Rename variable", + "command": "ballerina.action.positional.rename", + "arguments": [ + "testproject/modules/module3/module3.bal", + { + "line": 34, + "character": 8 + } + ] + }, + "resolvable": false + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/create-variable/config-rename-positional-capability/createVariableWithCheck7.json b/language-server/modules/langserver-core/src/test/resources/codeaction/create-variable/config-rename-positional-capability/createVariableWithCheck7.json new file mode 100644 index 000000000000..85578de87b15 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/create-variable/config-rename-positional-capability/createVariableWithCheck7.json @@ -0,0 +1,67 @@ +{ + "position": { + "line": 9, + "character": 9 + }, + "source": "testproject/modules/module3/module3.bal", + "description": "Parent function has undefined return type", + "expected": [ + { + "title": "Create variable and check error", + "kind": "quickfix", + "edits": [ + { + "range": { + "start": { + "line": 9, + "character": 4 + }, + "end": { + "line": 9, + "character": 4 + } + }, + "newText": "int intResult = " + }, + { + "range": { + "start": { + "line": 9, + "character": 4 + }, + "end": { + "line": 9, + "character": 4 + } + }, + "newText": "check " + }, + { + "range": { + "start": { + "line": 8, + "character": 42 + }, + "end": { + "line": 8, + "character": 42 + } + }, + "newText": " returns MyError?" + } + ], + "command": { + "title": "Rename variable", + "command": "ballerina.action.positional.rename", + "arguments": [ + "testproject/modules/module3/module3.bal", + { + "line": 9, + "character": 8 + } + ] + }, + "resolvable": false + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/create-variable/config-rename-positional-capability/createVariableWithCheck8.json b/language-server/modules/langserver-core/src/test/resources/codeaction/create-variable/config-rename-positional-capability/createVariableWithCheck8.json new file mode 100644 index 000000000000..8d0cf2fd8859 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/create-variable/config-rename-positional-capability/createVariableWithCheck8.json @@ -0,0 +1,54 @@ +{ + "position": { + "line": 13, + "character": 15 + }, + "source": "testproject/modules/module3/module3.bal", + "description": "Parent function has an error return type", + "expected": [ + { + "title": "Create variable and check error", + "kind": "quickfix", + "edits": [ + { + "range": { + "start": { + "line": 13, + "character": 4 + }, + "end": { + "line": 13, + "character": 4 + } + }, + "newText": "int int1 = " + }, + { + "range": { + "start": { + "line": 13, + "character": 4 + }, + "end": { + "line": 13, + "character": 4 + } + }, + "newText": "check " + } + ], + "command": { + "title": "Rename variable", + "command": "ballerina.action.positional.rename", + "arguments": [ + "testproject/modules/module3/module3.bal", + { + "line": 13, + "character": 8 + } + ] + }, + "resolvable": false + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/create-variable/config-rename-positional-capability/createVariableWithCheck9.json b/language-server/modules/langserver-core/src/test/resources/codeaction/create-variable/config-rename-positional-capability/createVariableWithCheck9.json new file mode 100644 index 000000000000..0b7b1993aa5c --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/create-variable/config-rename-positional-capability/createVariableWithCheck9.json @@ -0,0 +1,67 @@ +{ + "position": { + "line": 17, + "character": 17 + }, + "source": "testproject/modules/module3/module3.bal", + "description": "Add multiple error types to return", + "expected": [ + { + "title": "Create variable and check error", + "kind": "quickfix", + "edits": [ + { + "range": { + "start": { + "line": 17, + "character": 4 + }, + "end": { + "line": 17, + "character": 4 + } + }, + "newText": "int int1 = " + }, + { + "range": { + "start": { + "line": 17, + "character": 4 + }, + "end": { + "line": 17, + "character": 4 + } + }, + "newText": "check " + }, + { + "range": { + "start": { + "line": 16, + "character": 31 + }, + "end": { + "line": 16, + "character": 31 + } + }, + "newText": " returns module4:Error1|module4:Error2?" + } + ], + "command": { + "title": "Rename variable", + "command": "ballerina.action.positional.rename", + "arguments": [ + "testproject/modules/module3/module3.bal", + { + "line": 17, + "character": 8 + } + ] + }, + "resolvable": false + } + ] +} 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 5e729a2612e2..65777953967a 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 @@ -90,7 +90,7 @@ "character": 22 } }, - "newText": " returns error?" + "newText": " returns E1?" } ], "command": { diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/create-variable/config-rename-positional-capability/variableAssignmentRequiredCodeAction38.json b/language-server/modules/langserver-core/src/test/resources/codeaction/create-variable/config-rename-positional-capability/variableAssignmentRequiredCodeAction38.json index 3dfdba93ca19..316423ad37fe 100644 --- a/language-server/modules/langserver-core/src/test/resources/codeaction/create-variable/config-rename-positional-capability/variableAssignmentRequiredCodeAction38.json +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/create-variable/config-rename-positional-capability/variableAssignmentRequiredCodeAction38.json @@ -20,7 +20,7 @@ "character": 4 } }, - "newText": "object {public isolated function iterator() returns object {public isolated function next() returns record {|int value;|}?;};} objectResult = " + "newText": "isolated object {public isolated function iterator() returns isolated object {public isolated function next() returns record {|int value;|}?;};} objectResult = " } ], "command": { @@ -30,7 +30,7 @@ "createVariable5.bal", { "line": 85, - "character": 131 + "character": 149 } ] }, diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/create-variable/config-rename-positional-capability/variableAssignmentRequiredCodeAction39.json b/language-server/modules/langserver-core/src/test/resources/codeaction/create-variable/config-rename-positional-capability/variableAssignmentRequiredCodeAction39.json index 530d69e78d03..6d158cb5cc7f 100644 --- a/language-server/modules/langserver-core/src/test/resources/codeaction/create-variable/config-rename-positional-capability/variableAssignmentRequiredCodeAction39.json +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/create-variable/config-rename-positional-capability/variableAssignmentRequiredCodeAction39.json @@ -20,7 +20,7 @@ "character": 4 } }, - "newText": "object {public isolated function iterator() returns object {public isolated function next() returns record {|int value;|}?;};} objectResult = " + "newText": "isolated object {public isolated function iterator() returns isolated object {public isolated function next() returns record {|int value;|}?;};} objectResult = " } ], "command": { @@ -30,7 +30,7 @@ "createVariable5.bal", { "line": 86, - "character": 131 + "character": 149 } ] }, diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/create-variable/source/testproject/modules/module3/module3.bal b/language-server/modules/langserver-core/src/test/resources/codeaction/create-variable/source/testproject/modules/module3/module3.bal new file mode 100644 index 000000000000..1a6dea60dd5b --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/create-variable/source/testproject/modules/module3/module3.bal @@ -0,0 +1,35 @@ +import testproject.module4; + +public function getInt() returns int|MyError { + return 10; +} + +type MyError error; + +public function testFunction1(string name) { + getInt(); +} + +public function testFunction2() returns error? { + module4:getInt1(); +} + +public function testFunction3() { + module4:getInt1(); +} + +public function testFunction4() returns module4:Error1? { + module4:getInt2(); +} + +public function testFunction5() returns module4:Error3? { + module4:getInt1(); +} + +public function testFunction6() { + module4:getInt3(); +} + +public function testFunction7() returns error? { + module4:getInt3(); +} diff --git a/language-server/modules/langserver-core/src/test/resources/codeaction/create-variable/source/testproject/modules/module4/module4.bal b/language-server/modules/langserver-core/src/test/resources/codeaction/create-variable/source/testproject/modules/module4/module4.bal new file mode 100644 index 000000000000..4bc12367ed62 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/codeaction/create-variable/source/testproject/modules/module4/module4.bal @@ -0,0 +1,32 @@ +import ballerina/module1; + +public type ErrorDetail1 record {| + string cause; + int code; +|}; + +public type ErrorDetail2 record {| + string code; +|}; + +public type ErrorDetail3 record {| + string code; +|}; + +public type Error1 error; + +public type Error2 error; + +public type Error3 distinct Error1; + +public function getInt1() returns int|Error1|Error2|Error3 { + return 10; +} + +public function getInt2() returns int|Error2|Error3 { + return 10; +} + +public function getInt3() returns int|module1:ErrorOne|module1:ErrorTwo|Error1 { + return 10; +} diff --git a/language-server/modules/langserver-core/src/test/resources/completion/annotation_ctx/config/langAnnotations1.json b/language-server/modules/langserver-core/src/test/resources/completion/annotation_ctx/config/langAnnotations1.json index a349bfc4d1b6..8b77bb3f88ff 100644 --- a/language-server/modules/langserver-core/src/test/resources/completion/annotation_ctx/config/langAnnotations1.json +++ b/language-server/modules/langserver-core/src/test/resources/completion/annotation_ctx/config/langAnnotations1.json @@ -197,11 +197,11 @@ { "label": "...()", "kind": "Function", - "detail": "object {public isolated function iterator() returns object {public isolated function next() returns record {|int value;|}?;};}", + "detail": "isolated object {public isolated function iterator() returns isolated object {public isolated function next() returns record {|int value;|}?;};}", "documentation": { "right": { "kind": "markdown", - "value": "**Package:** _ballerina/lang.annotations:0.0.0_ \n \n \n \n \n**Return** `object {public isolated function iterator() returns object {public isolated function next() returns record {|int value;|}?;};}` \n \n" + "value": "**Package:** _ballerina/lang.annotations:0.0.0_ \n \n \n \n \n**Return** `isolated object {public isolated function iterator() returns isolated object {public isolated function next() returns record {|int value;|}?;};}` \n \n" } }, "sortText": "A", @@ -212,11 +212,11 @@ { "label": "..<()", "kind": "Function", - "detail": "object {public isolated function iterator() returns object {public isolated function next() returns record {|int value;|}?;};}", + "detail": "isolated object {public isolated function iterator() returns isolated object {public isolated function next() returns record {|int value;|}?;};}", "documentation": { "right": { "kind": "markdown", - "value": "**Package:** _ballerina/lang.annotations:0.0.0_ \n \n \n \n \n**Return** `object {public isolated function iterator() returns object {public isolated function next() returns record {|int value;|}?;};}` \n \n" + "value": "**Package:** _ballerina/lang.annotations:0.0.0_ \n \n \n \n \n**Return** `isolated object {public isolated function iterator() returns isolated object {public isolated function next() returns record {|int value;|}?;};}` \n \n" } }, "sortText": "A", diff --git a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/list_constructor_ctx_config1.json b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/list_constructor_ctx_config1.json index fb51ae8ab5b0..5e7c5250e359 100644 --- a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/list_constructor_ctx_config1.json +++ b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/list_constructor_ctx_config1.json @@ -739,6 +739,15 @@ "filterText": "xml ``", "insertText": "xml `${1}`", "insertTextFormat": "Snippet" + }, + { + "label": "...numberList", + "kind": "Variable", + "detail": "int[]", + "sortText": "AAC", + "filterText": "numberList", + "insertText": "...numberList", + "insertTextFormat": "Snippet" } ] } diff --git a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/list_constructor_ctx_config2.json b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/list_constructor_ctx_config2.json index c3308d90cebf..1daac91e2acc 100644 --- a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/list_constructor_ctx_config2.json +++ b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/list_constructor_ctx_config2.json @@ -739,6 +739,15 @@ "filterText": "xml ``", "insertText": "xml `${1}`", "insertTextFormat": "Snippet" + }, + { + "label": "...numberList", + "kind": "Variable", + "detail": "int[]", + "sortText": "AAC", + "filterText": "numberList", + "insertText": "...numberList", + "insertTextFormat": "Snippet" } ] } diff --git a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/list_constructor_ctx_config3.json b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/list_constructor_ctx_config3.json index 45d68a6e94ae..499565b33d8c 100644 --- a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/list_constructor_ctx_config3.json +++ b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/list_constructor_ctx_config3.json @@ -739,6 +739,15 @@ "filterText": "xml ``", "insertText": "xml `${1}`", "insertTextFormat": "Snippet" + }, + { + "label": "...numberList", + "kind": "Variable", + "detail": "int[]", + "sortText": "AAC", + "filterText": "numberList", + "insertText": "...numberList", + "insertTextFormat": "Snippet" } ] } diff --git a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/list_constructor_spread_member_ctx_config10.json b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/list_constructor_spread_member_ctx_config10.json new file mode 100644 index 000000000000..4af593ef0361 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/list_constructor_spread_member_ctx_config10.json @@ -0,0 +1,836 @@ +{ + "position": { + "line": 20, + "character": 22 + }, + "source": "expression_context/source/list_constructor_ctx_source6.bal", + "items": [ + { + "label": "test/project2", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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": "ARR", + "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": "ARR", + "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": "ARR", + "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": "ARR", + "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": "ARR", + "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": "ARR", + "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": "ARR", + "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": "ARR", + "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": "ARR", + "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": "ARR", + "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": "BN", + "insertText": "decimal", + "insertTextFormat": "Snippet" + }, + { + "label": "error", + "kind": "Event", + "detail": "Error", + "sortText": "BL", + "insertText": "error", + "insertTextFormat": "Snippet" + }, + { + "label": "object", + "kind": "Unit", + "detail": "type", + "sortText": "ARR", + "insertText": "object", + "insertTextFormat": "Snippet" + }, + { + "label": "transaction", + "kind": "Unit", + "detail": "type", + "sortText": "ARR", + "insertText": "transaction", + "insertTextFormat": "Snippet" + }, + { + "label": "xml", + "kind": "TypeParameter", + "detail": "Xml", + "sortText": "BN", + "insertText": "xml", + "insertTextFormat": "Snippet" + }, + { + "label": "table", + "kind": "Unit", + "detail": "type", + "sortText": "ARR", + "insertText": "table", + "insertTextFormat": "Snippet" + }, + { + "label": "map", + "kind": "Unit", + "detail": "type", + "sortText": "ARR", + "insertText": "map", + "insertTextFormat": "Snippet" + }, + { + "label": "stream", + "kind": "Unit", + "detail": "type", + "sortText": "ARR", + "insertText": "stream", + "insertTextFormat": "Snippet" + }, + { + "label": "boolean", + "kind": "TypeParameter", + "detail": "Boolean", + "sortText": "BN", + "insertText": "boolean", + "insertTextFormat": "Snippet" + }, + { + "label": "future", + "kind": "TypeParameter", + "detail": "Future", + "sortText": "BN", + "insertText": "future", + "insertTextFormat": "Snippet" + }, + { + "label": "int", + "kind": "TypeParameter", + "detail": "Int", + "sortText": "BN", + "insertText": "int", + "insertTextFormat": "Snippet" + }, + { + "label": "float", + "kind": "TypeParameter", + "detail": "Float", + "sortText": "BN", + "insertText": "float", + "insertTextFormat": "Snippet" + }, + { + "label": "function", + "kind": "TypeParameter", + "detail": "Function", + "sortText": "BN", + "insertText": "function", + "insertTextFormat": "Snippet" + }, + { + "label": "string", + "kind": "TypeParameter", + "detail": "String", + "sortText": "BN", + "insertText": "string", + "insertTextFormat": "Snippet" + }, + { + "label": "typedesc", + "kind": "TypeParameter", + "detail": "Typedesc", + "sortText": "BN", + "insertText": "typedesc", + "insertTextFormat": "Snippet" + }, + { + "label": "service", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "service", + "insertText": "service", + "insertTextFormat": "Snippet" + }, + { + "label": "new", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "new", + "insertText": "new ", + "insertTextFormat": "Snippet" + }, + { + "label": "isolated", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "isolated", + "insertText": "isolated ", + "insertTextFormat": "Snippet" + }, + { + "label": "transactional", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "transactional", + "insertText": "transactional", + "insertTextFormat": "Snippet" + }, + { + "label": "function", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "function", + "insertText": "function ", + "insertTextFormat": "Snippet" + }, + { + "label": "let", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "let", + "insertText": "let", + "insertTextFormat": "Snippet" + }, + { + "label": "typeof", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "typeof", + "insertText": "typeof ", + "insertTextFormat": "Snippet" + }, + { + "label": "trap", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "trap", + "insertText": "trap", + "insertTextFormat": "Snippet" + }, + { + "label": "client", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "client", + "insertText": "client ", + "insertTextFormat": "Snippet" + }, + { + "label": "true", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "true", + "insertText": "true", + "insertTextFormat": "Snippet" + }, + { + "label": "false", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "false", + "insertText": "false", + "insertTextFormat": "Snippet" + }, + { + "label": "null", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "null", + "insertText": "null", + "insertTextFormat": "Snippet" + }, + { + "label": "check", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "check", + "insertText": "check ", + "insertTextFormat": "Snippet" + }, + { + "label": "checkpanic", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "checkpanic", + "insertText": "checkpanic ", + "insertTextFormat": "Snippet" + }, + { + "label": "is", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "is", + "insertText": "is", + "insertTextFormat": "Snippet" + }, + { + "label": "error constructor", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "ATP", + "filterText": "error", + "insertText": "error(\"${1}\")", + "insertTextFormat": "Snippet" + }, + { + "label": "object constructor", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "ATP", + "filterText": "object", + "insertText": "object {${1}}", + "insertTextFormat": "Snippet" + }, + { + "label": "base16", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "ATP", + "filterText": "base16", + "insertText": "base16 `${1}`", + "insertTextFormat": "Snippet" + }, + { + "label": "base64", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "ATP", + "filterText": "base64", + "insertText": "base64 `${1}`", + "insertTextFormat": "Snippet" + }, + { + "label": "from", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "from", + "insertText": "from ", + "insertTextFormat": "Snippet" + }, + { + "label": "re ``", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "ATP", + "filterText": "re ``", + "insertText": "re `${1}`", + "insertTextFormat": "Snippet" + }, + { + "label": "string ``", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "ATP", + "filterText": "string ``", + "insertText": "string `${1}`", + "insertTextFormat": "Snippet" + }, + { + "label": "xml ``", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "ATP", + "filterText": "xml ``", + "insertText": "xml `${1}`", + "insertTextFormat": "Snippet" + }, + { + "label": "arr", + "kind": "Variable", + "detail": "int[]", + "sortText": "AABB", + "insertText": "arr", + "insertTextFormat": "Snippet" + }, + { + "label": "intArr1", + "kind": "Variable", + "detail": "int[]", + "sortText": "AABB", + "insertText": "intArr1", + "insertTextFormat": "Snippet" + }, + { + "label": "intArr3", + "kind": "Variable", + "detail": "int[][]", + "sortText": "AFB", + "insertText": "intArr3", + "insertTextFormat": "Snippet" + }, + { + "label": "i", + "kind": "Variable", + "detail": "int", + "sortText": "AFB", + "insertText": "i", + "insertTextFormat": "Snippet" + }, + { + "label": "a", + "kind": "Variable", + "detail": "string", + "sortText": "AFB", + "insertText": "a", + "insertTextFormat": "Snippet" + }, + { + "label": "dim2Arr", + "kind": "Variable", + "detail": "int[][]", + "sortText": "AFB", + "insertText": "dim2Arr", + "insertTextFormat": "Snippet" + }, + { + "label": "getInt()", + "kind": "Function", + "detail": "int", + "documentation": { + "right": { + "kind": "markdown", + "value": "**Package:** _._ \n \n \n \n \n**Return** `int` \n \n" + } + }, + "sortText": "AGC", + "filterText": "getInt", + "insertText": "getInt()", + "insertTextFormat": "Snippet" + }, + { + "label": "main()", + "kind": "Function", + "detail": "()", + "documentation": { + "right": { + "kind": "markdown", + "value": "**Package:** _._ \n \n \n" + } + }, + "sortText": "AZDZ", + "filterText": "main", + "insertText": "main()", + "insertTextFormat": "Snippet" + }, + { + "label": "intArr2", + "kind": "Variable", + "detail": "int[]", + "sortText": "AABB", + "insertText": "intArr2", + "insertTextFormat": "Snippet" + }, + { + "label": "Dim1", + "kind": "TypeParameter", + "detail": "Array", + "sortText": "BN", + "insertText": "Dim1", + "insertTextFormat": "Snippet" + }, + { + "label": "StrandData", + "kind": "Struct", + "detail": "Record", + "documentation": { + "left": "Describes Strand execution details for the runtime.\n" + }, + "sortText": "BM", + "insertText": "StrandData", + "insertTextFormat": "Snippet" + }, + { + "label": "Thread", + "kind": "TypeParameter", + "detail": "Union", + "sortText": "BN", + "insertText": "Thread", + "insertTextFormat": "Snippet" + }, + { + "label": "intArr5", + "kind": "Variable", + "detail": "Dim1[]", + "sortText": "AFB", + "insertText": "intArr5", + "insertTextFormat": "Snippet" + }, + { + "label": "intArr4", + "kind": "Variable", + "detail": "int[][]", + "sortText": "AFB", + "insertText": "intArr4", + "insertTextFormat": "Snippet" + }, + { + "label": "getArray()", + "kind": "Function", + "detail": "int[]", + "documentation": { + "right": { + "kind": "markdown", + "value": "**Package:** _._ \n \n \n \n \n**Return** `int[]` \n \n" + } + }, + "sortText": "AACC", + "filterText": "getArray", + "insertText": "getArray()", + "insertTextFormat": "Snippet" + }, + { + "label": "readonly", + "kind": "TypeParameter", + "detail": "Readonly", + "sortText": "BN", + "insertText": "readonly", + "insertTextFormat": "Snippet" + }, + { + "label": "handle", + "kind": "TypeParameter", + "detail": "Handle", + "sortText": "BN", + "insertText": "handle", + "insertTextFormat": "Snippet" + }, + { + "label": "never", + "kind": "TypeParameter", + "detail": "Never", + "sortText": "BN", + "insertText": "never", + "insertTextFormat": "Snippet" + }, + { + "label": "json", + "kind": "TypeParameter", + "detail": "Json", + "sortText": "BN", + "insertText": "json", + "insertTextFormat": "Snippet" + }, + { + "label": "anydata", + "kind": "TypeParameter", + "detail": "Anydata", + "sortText": "BN", + "insertText": "anydata", + "insertTextFormat": "Snippet" + }, + { + "label": "any", + "kind": "TypeParameter", + "detail": "Any", + "sortText": "BN", + "insertText": "any", + "insertTextFormat": "Snippet" + }, + { + "label": "byte", + "kind": "TypeParameter", + "detail": "Byte", + "sortText": "BN", + "insertText": "byte", + "insertTextFormat": "Snippet" + }, + { + "label": "...intArr3", + "kind": "Variable", + "detail": "int[][]", + "sortText": "AAC", + "filterText": "intArr3", + "insertText": "...intArr3", + "insertTextFormat": "Snippet" + }, + { + "label": "...dim2Arr", + "kind": "Variable", + "detail": "int[][]", + "sortText": "AAC", + "filterText": "dim2Arr", + "insertText": "...dim2Arr", + "insertTextFormat": "Snippet" + }, + { + "label": "...intArr5", + "kind": "Variable", + "detail": "Dim1[]", + "sortText": "AAC", + "filterText": "intArr5", + "insertText": "...intArr5", + "insertTextFormat": "Snippet" + }, + { + "label": "...intArr4", + "kind": "Variable", + "detail": "int[][]", + "sortText": "AAC", + "filterText": "intArr4", + "insertText": "...intArr4", + "insertTextFormat": "Snippet" + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/list_constructor_spread_member_ctx_config11.json b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/list_constructor_spread_member_ctx_config11.json new file mode 100644 index 000000000000..b7f070517fa9 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/list_constructor_spread_member_ctx_config11.json @@ -0,0 +1,808 @@ +{ + "position": { + "line": 22, + "character": 24 + }, + "source": "expression_context/source/list_constructor_ctx_source6.bal", + "items": [ + { + "label": "ballerina/lang.value", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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/module1", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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.array", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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": "ballerina/lang.runtime", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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/jballerina.java", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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.test", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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/project2", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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": "ARR", + "filterText": "project1", + "insertText": "project1", + "insertTextFormat": "Snippet", + "additionalTextEdits": [ + { + "range": { + "start": { + "line": 0, + "character": 0 + }, + "end": { + "line": 0, + "character": 0 + } + }, + "newText": "import test/project1;\n" + } + ] + }, + { + "label": "test/local_project2", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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": "ARR", + "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": "map", + "kind": "Unit", + "detail": "type", + "sortText": "ARR", + "insertText": "map", + "insertTextFormat": "Snippet" + }, + { + "label": "object", + "kind": "Unit", + "detail": "type", + "sortText": "ARR", + "insertText": "object", + "insertTextFormat": "Snippet" + }, + { + "label": "stream", + "kind": "Unit", + "detail": "type", + "sortText": "ARR", + "insertText": "stream", + "insertTextFormat": "Snippet" + }, + { + "label": "table", + "kind": "Unit", + "detail": "type", + "sortText": "ARR", + "insertText": "table", + "insertTextFormat": "Snippet" + }, + { + "label": "transaction", + "kind": "Unit", + "detail": "type", + "sortText": "ARR", + "insertText": "transaction", + "insertTextFormat": "Snippet" + }, + { + "label": "service", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "service", + "insertText": "service", + "insertTextFormat": "Snippet" + }, + { + "label": "new", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "new", + "insertText": "new ", + "insertTextFormat": "Snippet" + }, + { + "label": "isolated", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "isolated", + "insertText": "isolated ", + "insertTextFormat": "Snippet" + }, + { + "label": "transactional", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "transactional", + "insertText": "transactional", + "insertTextFormat": "Snippet" + }, + { + "label": "function", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "function", + "insertText": "function ", + "insertTextFormat": "Snippet" + }, + { + "label": "let", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "let", + "insertText": "let", + "insertTextFormat": "Snippet" + }, + { + "label": "typeof", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "typeof", + "insertText": "typeof ", + "insertTextFormat": "Snippet" + }, + { + "label": "trap", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "trap", + "insertText": "trap", + "insertTextFormat": "Snippet" + }, + { + "label": "client", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "client", + "insertText": "client ", + "insertTextFormat": "Snippet" + }, + { + "label": "true", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "true", + "insertText": "true", + "insertTextFormat": "Snippet" + }, + { + "label": "false", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "false", + "insertText": "false", + "insertTextFormat": "Snippet" + }, + { + "label": "null", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "null", + "insertText": "null", + "insertTextFormat": "Snippet" + }, + { + "label": "check", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "check", + "insertText": "check ", + "insertTextFormat": "Snippet" + }, + { + "label": "checkpanic", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "checkpanic", + "insertText": "checkpanic ", + "insertTextFormat": "Snippet" + }, + { + "label": "is", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "is", + "insertText": "is", + "insertTextFormat": "Snippet" + }, + { + "label": "error constructor", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "ATP", + "filterText": "error", + "insertText": "error(\"${1}\")", + "insertTextFormat": "Snippet" + }, + { + "label": "object constructor", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "ATP", + "filterText": "object", + "insertText": "object {${1}}", + "insertTextFormat": "Snippet" + }, + { + "label": "base16", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "ATP", + "filterText": "base16", + "insertText": "base16 `${1}`", + "insertTextFormat": "Snippet" + }, + { + "label": "base64", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "ATP", + "filterText": "base64", + "insertText": "base64 `${1}`", + "insertTextFormat": "Snippet" + }, + { + "label": "from", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "from", + "insertText": "from ", + "insertTextFormat": "Snippet" + }, + { + "label": "StrandData", + "kind": "Struct", + "detail": "Record", + "documentation": { + "left": "Describes Strand execution details for the runtime.\n" + }, + "sortText": "BM", + "insertText": "StrandData", + "insertTextFormat": "Snippet" + }, + { + "label": "Thread", + "kind": "TypeParameter", + "detail": "Union", + "sortText": "BN", + "insertText": "Thread", + "insertTextFormat": "Snippet" + }, + { + "label": "ballerina/lang.regexp", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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": "re ``", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "ATP", + "filterText": "re ``", + "insertText": "re `${1}`", + "insertTextFormat": "Snippet" + }, + { + "label": "decimal", + "kind": "TypeParameter", + "detail": "Decimal", + "sortText": "BN", + "insertText": "decimal", + "insertTextFormat": "Snippet" + }, + { + "label": "error", + "kind": "Event", + "detail": "Error", + "sortText": "BL", + "insertText": "error", + "insertTextFormat": "Snippet" + }, + { + "label": "xml", + "kind": "TypeParameter", + "detail": "Xml", + "sortText": "BN", + "insertText": "xml", + "insertTextFormat": "Snippet" + }, + { + "label": "boolean", + "kind": "TypeParameter", + "detail": "Boolean", + "sortText": "BN", + "insertText": "boolean", + "insertTextFormat": "Snippet" + }, + { + "label": "future", + "kind": "TypeParameter", + "detail": "Future", + "sortText": "BN", + "insertText": "future", + "insertTextFormat": "Snippet" + }, + { + "label": "int", + "kind": "TypeParameter", + "detail": "Int", + "sortText": "BN", + "insertText": "int", + "insertTextFormat": "Snippet" + }, + { + "label": "float", + "kind": "TypeParameter", + "detail": "Float", + "sortText": "BN", + "insertText": "float", + "insertTextFormat": "Snippet" + }, + { + "label": "function", + "kind": "TypeParameter", + "detail": "Function", + "sortText": "BN", + "insertText": "function", + "insertTextFormat": "Snippet" + }, + { + "label": "string", + "kind": "TypeParameter", + "detail": "String", + "sortText": "BN", + "insertText": "string", + "insertTextFormat": "Snippet" + }, + { + "label": "typedesc", + "kind": "TypeParameter", + "detail": "Typedesc", + "sortText": "BN", + "insertText": "typedesc", + "insertTextFormat": "Snippet" + }, + { + "label": "readonly", + "kind": "TypeParameter", + "detail": "Readonly", + "sortText": "BN", + "insertText": "readonly", + "insertTextFormat": "Snippet" + }, + { + "label": "handle", + "kind": "TypeParameter", + "detail": "Handle", + "sortText": "BN", + "insertText": "handle", + "insertTextFormat": "Snippet" + }, + { + "label": "never", + "kind": "TypeParameter", + "detail": "Never", + "sortText": "BN", + "insertText": "never", + "insertTextFormat": "Snippet" + }, + { + "label": "json", + "kind": "TypeParameter", + "detail": "Json", + "sortText": "BN", + "insertText": "json", + "insertTextFormat": "Snippet" + }, + { + "label": "anydata", + "kind": "TypeParameter", + "detail": "Anydata", + "sortText": "BN", + "insertText": "anydata", + "insertTextFormat": "Snippet" + }, + { + "label": "any", + "kind": "TypeParameter", + "detail": "Any", + "sortText": "BN", + "insertText": "any", + "insertTextFormat": "Snippet" + }, + { + "label": "byte", + "kind": "TypeParameter", + "detail": "Byte", + "sortText": "BN", + "insertText": "byte", + "insertTextFormat": "Snippet" + }, + { + "label": "string ``", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "ATP", + "filterText": "string ``", + "insertText": "string `${1}`", + "insertTextFormat": "Snippet" + }, + { + "label": "xml ``", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "ATP", + "filterText": "xml ``", + "insertText": "xml `${1}`", + "insertTextFormat": "Snippet" + }, + { + "label": "dim2Arr", + "kind": "Variable", + "detail": "int[][]", + "sortText": "AFB", + "insertText": "dim2Arr", + "insertTextFormat": "Snippet" + }, + { + "label": "getArray()", + "kind": "Function", + "detail": "int[]", + "documentation": { + "right": { + "kind": "markdown", + "value": "**Package:** _._ \n \n \n \n \n**Return** `int[]` \n \n" + } + }, + "sortText": "AGC", + "filterText": "getArray", + "insertText": "getArray()", + "insertTextFormat": "Snippet" + }, + { + "label": "intArr1", + "kind": "Variable", + "detail": "int[]", + "sortText": "AFB", + "insertText": "intArr1", + "insertTextFormat": "Snippet" + }, + { + "label": "intArr3", + "kind": "Variable", + "detail": "int[][]", + "sortText": "AFB", + "insertText": "intArr3", + "insertTextFormat": "Snippet" + }, + { + "label": "arr", + "kind": "Variable", + "detail": "int[]", + "sortText": "AFB", + "insertText": "arr", + "insertTextFormat": "Snippet" + }, + { + "label": "a", + "kind": "Variable", + "detail": "string", + "sortText": "AFB", + "insertText": "a", + "insertTextFormat": "Snippet" + }, + { + "label": "getInt()", + "kind": "Function", + "detail": "int", + "documentation": { + "right": { + "kind": "markdown", + "value": "**Package:** _._ \n \n \n \n \n**Return** `int` \n \n" + } + }, + "sortText": "AACC", + "filterText": "getInt", + "insertText": "getInt()", + "insertTextFormat": "Snippet" + }, + { + "label": "main()", + "kind": "Function", + "detail": "()", + "documentation": { + "right": { + "kind": "markdown", + "value": "**Package:** _._ \n \n \n" + } + }, + "sortText": "AZDZ", + "filterText": "main", + "insertText": "main()", + "insertTextFormat": "Snippet" + }, + { + "label": "Dim1", + "kind": "TypeParameter", + "detail": "Array", + "sortText": "BN", + "insertText": "Dim1", + "insertTextFormat": "Snippet" + }, + { + "label": "intArr4", + "kind": "Variable", + "detail": "int[][]", + "sortText": "AFB", + "insertText": "intArr4", + "insertTextFormat": "Snippet" + }, + { + "label": "intArr2", + "kind": "Variable", + "detail": "int[]", + "sortText": "AFB", + "insertText": "intArr2", + "insertTextFormat": "Snippet" + }, + { + "label": "intArr6", + "kind": "Variable", + "detail": "int[]", + "sortText": "AFB", + "insertText": "intArr6", + "insertTextFormat": "Snippet" + }, + { + "label": "intArr5", + "kind": "Variable", + "detail": "Dim1[]", + "sortText": "AFB", + "insertText": "intArr5", + "insertTextFormat": "Snippet" + }, + { + "label": "i", + "kind": "Variable", + "detail": "int", + "sortText": "AABB", + "insertText": "i", + "insertTextFormat": "Snippet" + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/list_constructor_spread_member_ctx_config6.json b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/list_constructor_spread_member_ctx_config6.json new file mode 100644 index 000000000000..26855d346f52 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/list_constructor_spread_member_ctx_config6.json @@ -0,0 +1,795 @@ +{ + "position": { + "line": 12, + "character": 21 + }, + "source": "expression_context/source/list_constructor_ctx_source6.bal", + "items": [ + { + "label": "ballerina/lang.value", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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/module1", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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.array", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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": "ballerina/lang.runtime", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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/jballerina.java", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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.test", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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/project2", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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": "ARR", + "filterText": "project1", + "insertText": "project1", + "insertTextFormat": "Snippet", + "additionalTextEdits": [ + { + "range": { + "start": { + "line": 0, + "character": 0 + }, + "end": { + "line": 0, + "character": 0 + } + }, + "newText": "import test/project1;\n" + } + ] + }, + { + "label": "test/local_project2", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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": "ARR", + "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": "map", + "kind": "Unit", + "detail": "type", + "sortText": "ARR", + "insertText": "map", + "insertTextFormat": "Snippet" + }, + { + "label": "object", + "kind": "Unit", + "detail": "type", + "sortText": "ARR", + "insertText": "object", + "insertTextFormat": "Snippet" + }, + { + "label": "stream", + "kind": "Unit", + "detail": "type", + "sortText": "ARR", + "insertText": "stream", + "insertTextFormat": "Snippet" + }, + { + "label": "table", + "kind": "Unit", + "detail": "type", + "sortText": "ARR", + "insertText": "table", + "insertTextFormat": "Snippet" + }, + { + "label": "transaction", + "kind": "Unit", + "detail": "type", + "sortText": "ARR", + "insertText": "transaction", + "insertTextFormat": "Snippet" + }, + { + "label": "service", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "service", + "insertText": "service", + "insertTextFormat": "Snippet" + }, + { + "label": "new", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "new", + "insertText": "new ", + "insertTextFormat": "Snippet" + }, + { + "label": "isolated", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "isolated", + "insertText": "isolated ", + "insertTextFormat": "Snippet" + }, + { + "label": "transactional", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "transactional", + "insertText": "transactional", + "insertTextFormat": "Snippet" + }, + { + "label": "function", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "function", + "insertText": "function ", + "insertTextFormat": "Snippet" + }, + { + "label": "let", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "let", + "insertText": "let", + "insertTextFormat": "Snippet" + }, + { + "label": "typeof", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "typeof", + "insertText": "typeof ", + "insertTextFormat": "Snippet" + }, + { + "label": "trap", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "trap", + "insertText": "trap", + "insertTextFormat": "Snippet" + }, + { + "label": "client", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "client", + "insertText": "client ", + "insertTextFormat": "Snippet" + }, + { + "label": "true", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "true", + "insertText": "true", + "insertTextFormat": "Snippet" + }, + { + "label": "false", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "false", + "insertText": "false", + "insertTextFormat": "Snippet" + }, + { + "label": "null", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "null", + "insertText": "null", + "insertTextFormat": "Snippet" + }, + { + "label": "check", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "check", + "insertText": "check ", + "insertTextFormat": "Snippet" + }, + { + "label": "checkpanic", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "checkpanic", + "insertText": "checkpanic ", + "insertTextFormat": "Snippet" + }, + { + "label": "is", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "is", + "insertText": "is", + "insertTextFormat": "Snippet" + }, + { + "label": "error constructor", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "ATP", + "filterText": "error", + "insertText": "error(\"${1}\")", + "insertTextFormat": "Snippet" + }, + { + "label": "object constructor", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "ATP", + "filterText": "object", + "insertText": "object {${1}}", + "insertTextFormat": "Snippet" + }, + { + "label": "base16", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "ATP", + "filterText": "base16", + "insertText": "base16 `${1}`", + "insertTextFormat": "Snippet" + }, + { + "label": "base64", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "ATP", + "filterText": "base64", + "insertText": "base64 `${1}`", + "insertTextFormat": "Snippet" + }, + { + "label": "from", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "from", + "insertText": "from ", + "insertTextFormat": "Snippet" + }, + { + "label": "StrandData", + "kind": "Struct", + "detail": "Record", + "documentation": { + "left": "Describes Strand execution details for the runtime.\n" + }, + "sortText": "BM", + "insertText": "StrandData", + "insertTextFormat": "Snippet" + }, + { + "label": "Thread", + "kind": "TypeParameter", + "detail": "Union", + "sortText": "BN", + "insertText": "Thread", + "insertTextFormat": "Snippet" + }, + { + "label": "ballerina/lang.regexp", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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": "re ``", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "ATP", + "filterText": "re ``", + "insertText": "re `${1}`", + "insertTextFormat": "Snippet" + }, + { + "label": "decimal", + "kind": "TypeParameter", + "detail": "Decimal", + "sortText": "BN", + "insertText": "decimal", + "insertTextFormat": "Snippet" + }, + { + "label": "error", + "kind": "Event", + "detail": "Error", + "sortText": "BL", + "insertText": "error", + "insertTextFormat": "Snippet" + }, + { + "label": "xml", + "kind": "TypeParameter", + "detail": "Xml", + "sortText": "BN", + "insertText": "xml", + "insertTextFormat": "Snippet" + }, + { + "label": "boolean", + "kind": "TypeParameter", + "detail": "Boolean", + "sortText": "BN", + "insertText": "boolean", + "insertTextFormat": "Snippet" + }, + { + "label": "future", + "kind": "TypeParameter", + "detail": "Future", + "sortText": "BN", + "insertText": "future", + "insertTextFormat": "Snippet" + }, + { + "label": "int", + "kind": "TypeParameter", + "detail": "Int", + "sortText": "BN", + "insertText": "int", + "insertTextFormat": "Snippet" + }, + { + "label": "float", + "kind": "TypeParameter", + "detail": "Float", + "sortText": "BN", + "insertText": "float", + "insertTextFormat": "Snippet" + }, + { + "label": "function", + "kind": "TypeParameter", + "detail": "Function", + "sortText": "BN", + "insertText": "function", + "insertTextFormat": "Snippet" + }, + { + "label": "string", + "kind": "TypeParameter", + "detail": "String", + "sortText": "BN", + "insertText": "string", + "insertTextFormat": "Snippet" + }, + { + "label": "typedesc", + "kind": "TypeParameter", + "detail": "Typedesc", + "sortText": "BN", + "insertText": "typedesc", + "insertTextFormat": "Snippet" + }, + { + "label": "readonly", + "kind": "TypeParameter", + "detail": "Readonly", + "sortText": "BN", + "insertText": "readonly", + "insertTextFormat": "Snippet" + }, + { + "label": "handle", + "kind": "TypeParameter", + "detail": "Handle", + "sortText": "BN", + "insertText": "handle", + "insertTextFormat": "Snippet" + }, + { + "label": "never", + "kind": "TypeParameter", + "detail": "Never", + "sortText": "BN", + "insertText": "never", + "insertTextFormat": "Snippet" + }, + { + "label": "json", + "kind": "TypeParameter", + "detail": "Json", + "sortText": "BN", + "insertText": "json", + "insertTextFormat": "Snippet" + }, + { + "label": "anydata", + "kind": "TypeParameter", + "detail": "Anydata", + "sortText": "BN", + "insertText": "anydata", + "insertTextFormat": "Snippet" + }, + { + "label": "any", + "kind": "TypeParameter", + "detail": "Any", + "sortText": "BN", + "insertText": "any", + "insertTextFormat": "Snippet" + }, + { + "label": "byte", + "kind": "TypeParameter", + "detail": "Byte", + "sortText": "BN", + "insertText": "byte", + "insertTextFormat": "Snippet" + }, + { + "label": "string ``", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "ATP", + "filterText": "string ``", + "insertText": "string `${1}`", + "insertTextFormat": "Snippet" + }, + { + "label": "xml ``", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "ATP", + "filterText": "xml ``", + "insertText": "xml `${1}`", + "insertTextFormat": "Snippet" + }, + { + "label": "dim2Arr", + "kind": "Variable", + "detail": "int[][]", + "sortText": "AFB", + "insertText": "dim2Arr", + "insertTextFormat": "Snippet" + }, + { + "label": "getArray()", + "kind": "Function", + "detail": "int[]", + "documentation": { + "right": { + "kind": "markdown", + "value": "**Package:** _._ \n \n \n \n \n**Return** `int[]` \n \n" + } + }, + "sortText": "AGC", + "filterText": "getArray", + "insertText": "getArray()", + "insertTextFormat": "Snippet" + }, + { + "label": "intArr1", + "kind": "Variable", + "detail": "int[]", + "sortText": "AFB", + "insertText": "intArr1", + "insertTextFormat": "Snippet" + }, + { + "label": "arr", + "kind": "Variable", + "detail": "int[]", + "sortText": "AFB", + "insertText": "arr", + "insertTextFormat": "Snippet" + }, + { + "label": "a", + "kind": "Variable", + "detail": "string", + "sortText": "AFB", + "insertText": "a", + "insertTextFormat": "Snippet" + }, + { + "label": "getInt()", + "kind": "Function", + "detail": "int", + "documentation": { + "right": { + "kind": "markdown", + "value": "**Package:** _._ \n \n \n \n \n**Return** `int` \n \n" + } + }, + "sortText": "AACC", + "filterText": "getInt", + "insertText": "getInt()", + "insertTextFormat": "Snippet" + }, + { + "label": "main()", + "kind": "Function", + "detail": "()", + "documentation": { + "right": { + "kind": "markdown", + "value": "**Package:** _._ \n \n \n" + } + }, + "sortText": "AZDZ", + "filterText": "main", + "insertText": "main()", + "insertTextFormat": "Snippet" + }, + { + "label": "Dim1", + "kind": "TypeParameter", + "detail": "Array", + "sortText": "BN", + "insertText": "Dim1", + "insertTextFormat": "Snippet" + }, + { + "label": "i", + "kind": "Variable", + "detail": "int", + "sortText": "AABB", + "insertText": "i", + "insertTextFormat": "Snippet" + }, + { + "label": "...getArray()", + "kind": "Function", + "detail": "int[]", + "sortText": "AAD", + "filterText": "getArray", + "insertText": "...getArray()", + "insertTextFormat": "Snippet" + }, + { + "label": "...intArr1", + "kind": "Variable", + "detail": "int[]", + "sortText": "AAC", + "filterText": "intArr1", + "insertText": "...intArr1", + "insertTextFormat": "Snippet" + }, + { + "label": "...arr", + "kind": "Variable", + "detail": "int[]", + "sortText": "AAC", + "filterText": "arr", + "insertText": "...arr", + "insertTextFormat": "Snippet" + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/list_constructor_spread_member_ctx_config7.json b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/list_constructor_spread_member_ctx_config7.json new file mode 100644 index 000000000000..25e7f19bb510 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/list_constructor_spread_member_ctx_config7.json @@ -0,0 +1,812 @@ +{ + "position": { + "line": 14, + "character": 29 + }, + "source": "expression_context/source/list_constructor_ctx_source6.bal", + "items": [ + { + "label": "ballerina/lang.value", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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/module1", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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.array", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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": "ballerina/lang.runtime", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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/jballerina.java", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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.test", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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/project2", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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": "ARR", + "filterText": "project1", + "insertText": "project1", + "insertTextFormat": "Snippet", + "additionalTextEdits": [ + { + "range": { + "start": { + "line": 0, + "character": 0 + }, + "end": { + "line": 0, + "character": 0 + } + }, + "newText": "import test/project1;\n" + } + ] + }, + { + "label": "test/local_project2", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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": "ARR", + "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": "map", + "kind": "Unit", + "detail": "type", + "sortText": "ARR", + "insertText": "map", + "insertTextFormat": "Snippet" + }, + { + "label": "object", + "kind": "Unit", + "detail": "type", + "sortText": "ARR", + "insertText": "object", + "insertTextFormat": "Snippet" + }, + { + "label": "stream", + "kind": "Unit", + "detail": "type", + "sortText": "ARR", + "insertText": "stream", + "insertTextFormat": "Snippet" + }, + { + "label": "table", + "kind": "Unit", + "detail": "type", + "sortText": "ARR", + "insertText": "table", + "insertTextFormat": "Snippet" + }, + { + "label": "transaction", + "kind": "Unit", + "detail": "type", + "sortText": "ARR", + "insertText": "transaction", + "insertTextFormat": "Snippet" + }, + { + "label": "service", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "service", + "insertText": "service", + "insertTextFormat": "Snippet" + }, + { + "label": "new", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "new", + "insertText": "new ", + "insertTextFormat": "Snippet" + }, + { + "label": "isolated", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "isolated", + "insertText": "isolated ", + "insertTextFormat": "Snippet" + }, + { + "label": "transactional", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "transactional", + "insertText": "transactional", + "insertTextFormat": "Snippet" + }, + { + "label": "function", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "function", + "insertText": "function ", + "insertTextFormat": "Snippet" + }, + { + "label": "let", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "let", + "insertText": "let", + "insertTextFormat": "Snippet" + }, + { + "label": "typeof", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "typeof", + "insertText": "typeof ", + "insertTextFormat": "Snippet" + }, + { + "label": "trap", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "trap", + "insertText": "trap", + "insertTextFormat": "Snippet" + }, + { + "label": "client", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "client", + "insertText": "client ", + "insertTextFormat": "Snippet" + }, + { + "label": "true", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "true", + "insertText": "true", + "insertTextFormat": "Snippet" + }, + { + "label": "false", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "false", + "insertText": "false", + "insertTextFormat": "Snippet" + }, + { + "label": "null", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "null", + "insertText": "null", + "insertTextFormat": "Snippet" + }, + { + "label": "check", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "check", + "insertText": "check ", + "insertTextFormat": "Snippet" + }, + { + "label": "checkpanic", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "checkpanic", + "insertText": "checkpanic ", + "insertTextFormat": "Snippet" + }, + { + "label": "is", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "is", + "insertText": "is", + "insertTextFormat": "Snippet" + }, + { + "label": "error constructor", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "ATP", + "filterText": "error", + "insertText": "error(\"${1}\")", + "insertTextFormat": "Snippet" + }, + { + "label": "object constructor", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "ATP", + "filterText": "object", + "insertText": "object {${1}}", + "insertTextFormat": "Snippet" + }, + { + "label": "base16", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "ATP", + "filterText": "base16", + "insertText": "base16 `${1}`", + "insertTextFormat": "Snippet" + }, + { + "label": "base64", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "ATP", + "filterText": "base64", + "insertText": "base64 `${1}`", + "insertTextFormat": "Snippet" + }, + { + "label": "from", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "from", + "insertText": "from ", + "insertTextFormat": "Snippet" + }, + { + "label": "StrandData", + "kind": "Struct", + "detail": "Record", + "documentation": { + "left": "Describes Strand execution details for the runtime.\n" + }, + "sortText": "BM", + "insertText": "StrandData", + "insertTextFormat": "Snippet" + }, + { + "label": "Thread", + "kind": "TypeParameter", + "detail": "Union", + "sortText": "BN", + "insertText": "Thread", + "insertTextFormat": "Snippet" + }, + { + "label": "ballerina/lang.regexp", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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": "re ``", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "ATP", + "filterText": "re ``", + "insertText": "re `${1}`", + "insertTextFormat": "Snippet" + }, + { + "label": "decimal", + "kind": "TypeParameter", + "detail": "Decimal", + "sortText": "BN", + "insertText": "decimal", + "insertTextFormat": "Snippet" + }, + { + "label": "error", + "kind": "Event", + "detail": "Error", + "sortText": "BL", + "insertText": "error", + "insertTextFormat": "Snippet" + }, + { + "label": "xml", + "kind": "TypeParameter", + "detail": "Xml", + "sortText": "BN", + "insertText": "xml", + "insertTextFormat": "Snippet" + }, + { + "label": "boolean", + "kind": "TypeParameter", + "detail": "Boolean", + "sortText": "BN", + "insertText": "boolean", + "insertTextFormat": "Snippet" + }, + { + "label": "future", + "kind": "TypeParameter", + "detail": "Future", + "sortText": "BN", + "insertText": "future", + "insertTextFormat": "Snippet" + }, + { + "label": "int", + "kind": "TypeParameter", + "detail": "Int", + "sortText": "BN", + "insertText": "int", + "insertTextFormat": "Snippet" + }, + { + "label": "float", + "kind": "TypeParameter", + "detail": "Float", + "sortText": "BN", + "insertText": "float", + "insertTextFormat": "Snippet" + }, + { + "label": "function", + "kind": "TypeParameter", + "detail": "Function", + "sortText": "BN", + "insertText": "function", + "insertTextFormat": "Snippet" + }, + { + "label": "string", + "kind": "TypeParameter", + "detail": "String", + "sortText": "BN", + "insertText": "string", + "insertTextFormat": "Snippet" + }, + { + "label": "typedesc", + "kind": "TypeParameter", + "detail": "Typedesc", + "sortText": "BN", + "insertText": "typedesc", + "insertTextFormat": "Snippet" + }, + { + "label": "readonly", + "kind": "TypeParameter", + "detail": "Readonly", + "sortText": "BN", + "insertText": "readonly", + "insertTextFormat": "Snippet" + }, + { + "label": "handle", + "kind": "TypeParameter", + "detail": "Handle", + "sortText": "BN", + "insertText": "handle", + "insertTextFormat": "Snippet" + }, + { + "label": "never", + "kind": "TypeParameter", + "detail": "Never", + "sortText": "BN", + "insertText": "never", + "insertTextFormat": "Snippet" + }, + { + "label": "json", + "kind": "TypeParameter", + "detail": "Json", + "sortText": "BN", + "insertText": "json", + "insertTextFormat": "Snippet" + }, + { + "label": "anydata", + "kind": "TypeParameter", + "detail": "Anydata", + "sortText": "BN", + "insertText": "anydata", + "insertTextFormat": "Snippet" + }, + { + "label": "any", + "kind": "TypeParameter", + "detail": "Any", + "sortText": "BN", + "insertText": "any", + "insertTextFormat": "Snippet" + }, + { + "label": "byte", + "kind": "TypeParameter", + "detail": "Byte", + "sortText": "BN", + "insertText": "byte", + "insertTextFormat": "Snippet" + }, + { + "label": "string ``", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "ATP", + "filterText": "string ``", + "insertText": "string `${1}`", + "insertTextFormat": "Snippet" + }, + { + "label": "xml ``", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "ATP", + "filterText": "xml ``", + "insertText": "xml `${1}`", + "insertTextFormat": "Snippet" + }, + { + "label": "dim2Arr", + "kind": "Variable", + "detail": "int[][]", + "sortText": "AFB", + "insertText": "dim2Arr", + "insertTextFormat": "Snippet" + }, + { + "label": "getArray()", + "kind": "Function", + "detail": "int[]", + "documentation": { + "right": { + "kind": "markdown", + "value": "**Package:** _._ \n \n \n \n \n**Return** `int[]` \n \n" + } + }, + "sortText": "AGC", + "filterText": "getArray", + "insertText": "getArray()", + "insertTextFormat": "Snippet" + }, + { + "label": "intArr1", + "kind": "Variable", + "detail": "int[]", + "sortText": "AFB", + "insertText": "intArr1", + "insertTextFormat": "Snippet" + }, + { + "label": "arr", + "kind": "Variable", + "detail": "int[]", + "sortText": "AFB", + "insertText": "arr", + "insertTextFormat": "Snippet" + }, + { + "label": "a", + "kind": "Variable", + "detail": "string", + "sortText": "AFB", + "insertText": "a", + "insertTextFormat": "Snippet" + }, + { + "label": "getInt()", + "kind": "Function", + "detail": "int", + "documentation": { + "right": { + "kind": "markdown", + "value": "**Package:** _._ \n \n \n \n \n**Return** `int` \n \n" + } + }, + "sortText": "AACC", + "filterText": "getInt", + "insertText": "getInt()", + "insertTextFormat": "Snippet" + }, + { + "label": "main()", + "kind": "Function", + "detail": "()", + "documentation": { + "right": { + "kind": "markdown", + "value": "**Package:** _._ \n \n \n" + } + }, + "sortText": "AZDZ", + "filterText": "main", + "insertText": "main()", + "insertTextFormat": "Snippet" + }, + { + "label": "Dim1", + "kind": "TypeParameter", + "detail": "Array", + "sortText": "BN", + "insertText": "Dim1", + "insertTextFormat": "Snippet" + }, + { + "label": "intArr2", + "kind": "Variable", + "detail": "int[]", + "sortText": "AFB", + "insertText": "intArr2", + "insertTextFormat": "Snippet" + }, + { + "label": "i", + "kind": "Variable", + "detail": "int", + "sortText": "AABB", + "insertText": "i", + "insertTextFormat": "Snippet" + }, + { + "label": "...getArray()", + "kind": "Function", + "detail": "int[]", + "sortText": "AAD", + "filterText": "getArray", + "insertText": "...getArray()", + "insertTextFormat": "Snippet" + }, + { + "label": "...intArr1", + "kind": "Variable", + "detail": "int[]", + "sortText": "AAC", + "filterText": "intArr1", + "insertText": "...intArr1", + "insertTextFormat": "Snippet" + }, + { + "label": "...arr", + "kind": "Variable", + "detail": "int[]", + "sortText": "AAC", + "filterText": "arr", + "insertText": "...arr", + "insertTextFormat": "Snippet" + }, + { + "label": "...intArr2", + "kind": "Variable", + "detail": "int[]", + "sortText": "AAC", + "filterText": "intArr2", + "insertText": "...intArr2", + "insertTextFormat": "Snippet" + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/list_constructor_spread_member_ctx_config8.json b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/list_constructor_spread_member_ctx_config8.json new file mode 100644 index 000000000000..db5e80ceee89 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/list_constructor_spread_member_ctx_config8.json @@ -0,0 +1,820 @@ +{ + "position": { + "line": 16, + "character": 24 + }, + "source": "expression_context/source/list_constructor_ctx_source6.bal", + "items": [ + { + "label": "ballerina/lang.value", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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/module1", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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.array", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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": "ballerina/lang.runtime", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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/jballerina.java", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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.test", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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/project2", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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": "ARR", + "filterText": "project1", + "insertText": "project1", + "insertTextFormat": "Snippet", + "additionalTextEdits": [ + { + "range": { + "start": { + "line": 0, + "character": 0 + }, + "end": { + "line": 0, + "character": 0 + } + }, + "newText": "import test/project1;\n" + } + ] + }, + { + "label": "test/local_project2", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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": "ARR", + "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": "map", + "kind": "Unit", + "detail": "type", + "sortText": "ARR", + "insertText": "map", + "insertTextFormat": "Snippet" + }, + { + "label": "object", + "kind": "Unit", + "detail": "type", + "sortText": "ARR", + "insertText": "object", + "insertTextFormat": "Snippet" + }, + { + "label": "stream", + "kind": "Unit", + "detail": "type", + "sortText": "ARR", + "insertText": "stream", + "insertTextFormat": "Snippet" + }, + { + "label": "table", + "kind": "Unit", + "detail": "type", + "sortText": "ARR", + "insertText": "table", + "insertTextFormat": "Snippet" + }, + { + "label": "transaction", + "kind": "Unit", + "detail": "type", + "sortText": "ARR", + "insertText": "transaction", + "insertTextFormat": "Snippet" + }, + { + "label": "service", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "service", + "insertText": "service", + "insertTextFormat": "Snippet" + }, + { + "label": "new", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "new", + "insertText": "new ", + "insertTextFormat": "Snippet" + }, + { + "label": "isolated", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "isolated", + "insertText": "isolated ", + "insertTextFormat": "Snippet" + }, + { + "label": "transactional", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "transactional", + "insertText": "transactional", + "insertTextFormat": "Snippet" + }, + { + "label": "function", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "function", + "insertText": "function ", + "insertTextFormat": "Snippet" + }, + { + "label": "let", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "let", + "insertText": "let", + "insertTextFormat": "Snippet" + }, + { + "label": "typeof", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "typeof", + "insertText": "typeof ", + "insertTextFormat": "Snippet" + }, + { + "label": "trap", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "trap", + "insertText": "trap", + "insertTextFormat": "Snippet" + }, + { + "label": "client", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "client", + "insertText": "client ", + "insertTextFormat": "Snippet" + }, + { + "label": "true", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "true", + "insertText": "true", + "insertTextFormat": "Snippet" + }, + { + "label": "false", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "false", + "insertText": "false", + "insertTextFormat": "Snippet" + }, + { + "label": "null", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "null", + "insertText": "null", + "insertTextFormat": "Snippet" + }, + { + "label": "check", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "check", + "insertText": "check ", + "insertTextFormat": "Snippet" + }, + { + "label": "checkpanic", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "checkpanic", + "insertText": "checkpanic ", + "insertTextFormat": "Snippet" + }, + { + "label": "is", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "is", + "insertText": "is", + "insertTextFormat": "Snippet" + }, + { + "label": "error constructor", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "ATP", + "filterText": "error", + "insertText": "error(\"${1}\")", + "insertTextFormat": "Snippet" + }, + { + "label": "object constructor", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "ATP", + "filterText": "object", + "insertText": "object {${1}}", + "insertTextFormat": "Snippet" + }, + { + "label": "base16", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "ATP", + "filterText": "base16", + "insertText": "base16 `${1}`", + "insertTextFormat": "Snippet" + }, + { + "label": "base64", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "ATP", + "filterText": "base64", + "insertText": "base64 `${1}`", + "insertTextFormat": "Snippet" + }, + { + "label": "from", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "from", + "insertText": "from ", + "insertTextFormat": "Snippet" + }, + { + "label": "StrandData", + "kind": "Struct", + "detail": "Record", + "documentation": { + "left": "Describes Strand execution details for the runtime.\n" + }, + "sortText": "BM", + "insertText": "StrandData", + "insertTextFormat": "Snippet" + }, + { + "label": "Thread", + "kind": "TypeParameter", + "detail": "Union", + "sortText": "BN", + "insertText": "Thread", + "insertTextFormat": "Snippet" + }, + { + "label": "ballerina/lang.regexp", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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": "re ``", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "ATP", + "filterText": "re ``", + "insertText": "re `${1}`", + "insertTextFormat": "Snippet" + }, + { + "label": "decimal", + "kind": "TypeParameter", + "detail": "Decimal", + "sortText": "BN", + "insertText": "decimal", + "insertTextFormat": "Snippet" + }, + { + "label": "error", + "kind": "Event", + "detail": "Error", + "sortText": "BL", + "insertText": "error", + "insertTextFormat": "Snippet" + }, + { + "label": "xml", + "kind": "TypeParameter", + "detail": "Xml", + "sortText": "BN", + "insertText": "xml", + "insertTextFormat": "Snippet" + }, + { + "label": "boolean", + "kind": "TypeParameter", + "detail": "Boolean", + "sortText": "BN", + "insertText": "boolean", + "insertTextFormat": "Snippet" + }, + { + "label": "future", + "kind": "TypeParameter", + "detail": "Future", + "sortText": "BN", + "insertText": "future", + "insertTextFormat": "Snippet" + }, + { + "label": "int", + "kind": "TypeParameter", + "detail": "Int", + "sortText": "BN", + "insertText": "int", + "insertTextFormat": "Snippet" + }, + { + "label": "float", + "kind": "TypeParameter", + "detail": "Float", + "sortText": "BN", + "insertText": "float", + "insertTextFormat": "Snippet" + }, + { + "label": "function", + "kind": "TypeParameter", + "detail": "Function", + "sortText": "BN", + "insertText": "function", + "insertTextFormat": "Snippet" + }, + { + "label": "string", + "kind": "TypeParameter", + "detail": "String", + "sortText": "BN", + "insertText": "string", + "insertTextFormat": "Snippet" + }, + { + "label": "typedesc", + "kind": "TypeParameter", + "detail": "Typedesc", + "sortText": "BN", + "insertText": "typedesc", + "insertTextFormat": "Snippet" + }, + { + "label": "readonly", + "kind": "TypeParameter", + "detail": "Readonly", + "sortText": "BN", + "insertText": "readonly", + "insertTextFormat": "Snippet" + }, + { + "label": "handle", + "kind": "TypeParameter", + "detail": "Handle", + "sortText": "BN", + "insertText": "handle", + "insertTextFormat": "Snippet" + }, + { + "label": "never", + "kind": "TypeParameter", + "detail": "Never", + "sortText": "BN", + "insertText": "never", + "insertTextFormat": "Snippet" + }, + { + "label": "json", + "kind": "TypeParameter", + "detail": "Json", + "sortText": "BN", + "insertText": "json", + "insertTextFormat": "Snippet" + }, + { + "label": "anydata", + "kind": "TypeParameter", + "detail": "Anydata", + "sortText": "BN", + "insertText": "anydata", + "insertTextFormat": "Snippet" + }, + { + "label": "any", + "kind": "TypeParameter", + "detail": "Any", + "sortText": "BN", + "insertText": "any", + "insertTextFormat": "Snippet" + }, + { + "label": "byte", + "kind": "TypeParameter", + "detail": "Byte", + "sortText": "BN", + "insertText": "byte", + "insertTextFormat": "Snippet" + }, + { + "label": "string ``", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "ATP", + "filterText": "string ``", + "insertText": "string `${1}`", + "insertTextFormat": "Snippet" + }, + { + "label": "xml ``", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "ATP", + "filterText": "xml ``", + "insertText": "xml `${1}`", + "insertTextFormat": "Snippet" + }, + { + "label": "dim2Arr", + "kind": "Variable", + "detail": "int[][]", + "sortText": "AFB", + "insertText": "dim2Arr", + "insertTextFormat": "Snippet" + }, + { + "label": "getArray()", + "kind": "Function", + "detail": "int[]", + "documentation": { + "right": { + "kind": "markdown", + "value": "**Package:** _._ \n \n \n \n \n**Return** `int[]` \n \n" + } + }, + "sortText": "AGC", + "filterText": "getArray", + "insertText": "getArray()", + "insertTextFormat": "Snippet" + }, + { + "label": "intArr1", + "kind": "Variable", + "detail": "int[]", + "sortText": "AFB", + "insertText": "intArr1", + "insertTextFormat": "Snippet" + }, + { + "label": "intArr3", + "kind": "Variable", + "detail": "int[][]", + "sortText": "AFB", + "insertText": "intArr3", + "insertTextFormat": "Snippet" + }, + { + "label": "arr", + "kind": "Variable", + "detail": "int[]", + "sortText": "AFB", + "insertText": "arr", + "insertTextFormat": "Snippet" + }, + { + "label": "a", + "kind": "Variable", + "detail": "string", + "sortText": "AFB", + "insertText": "a", + "insertTextFormat": "Snippet" + }, + { + "label": "getInt()", + "kind": "Function", + "detail": "int", + "documentation": { + "right": { + "kind": "markdown", + "value": "**Package:** _._ \n \n \n \n \n**Return** `int` \n \n" + } + }, + "sortText": "AACC", + "filterText": "getInt", + "insertText": "getInt()", + "insertTextFormat": "Snippet" + }, + { + "label": "main()", + "kind": "Function", + "detail": "()", + "documentation": { + "right": { + "kind": "markdown", + "value": "**Package:** _._ \n \n \n" + } + }, + "sortText": "AZDZ", + "filterText": "main", + "insertText": "main()", + "insertTextFormat": "Snippet" + }, + { + "label": "Dim1", + "kind": "TypeParameter", + "detail": "Array", + "sortText": "BN", + "insertText": "Dim1", + "insertTextFormat": "Snippet" + }, + { + "label": "intArr2", + "kind": "Variable", + "detail": "int[]", + "sortText": "AFB", + "insertText": "intArr2", + "insertTextFormat": "Snippet" + }, + { + "label": "i", + "kind": "Variable", + "detail": "int", + "sortText": "AABB", + "insertText": "i", + "insertTextFormat": "Snippet" + }, + { + "label": "...getArray()", + "kind": "Function", + "detail": "int[]", + "sortText": "AAD", + "filterText": "getArray", + "insertText": "...getArray()", + "insertTextFormat": "Snippet" + }, + { + "label": "...intArr1", + "kind": "Variable", + "detail": "int[]", + "sortText": "AAC", + "filterText": "intArr1", + "insertText": "...intArr1", + "insertTextFormat": "Snippet" + }, + { + "label": "...arr", + "kind": "Variable", + "detail": "int[]", + "sortText": "AAC", + "filterText": "arr", + "insertText": "...arr", + "insertTextFormat": "Snippet" + }, + { + "label": "...intArr2", + "kind": "Variable", + "detail": "int[]", + "sortText": "AAC", + "filterText": "intArr2", + "insertText": "...intArr2", + "insertTextFormat": "Snippet" + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/list_constructor_spread_member_ctx_config9.json b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/list_constructor_spread_member_ctx_config9.json new file mode 100644 index 000000000000..c46fc89f3e01 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/list_constructor_spread_member_ctx_config9.json @@ -0,0 +1,819 @@ +{ + "position": { + "line": 18, + "character": 35 + }, + "source": "expression_context/source/list_constructor_ctx_source6.bal", + "items": [ + { + "label": "ballerina/lang.value", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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/module1", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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.array", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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": "ballerina/lang.runtime", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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/jballerina.java", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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.test", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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/project2", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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": "ARR", + "filterText": "project1", + "insertText": "project1", + "insertTextFormat": "Snippet", + "additionalTextEdits": [ + { + "range": { + "start": { + "line": 0, + "character": 0 + }, + "end": { + "line": 0, + "character": 0 + } + }, + "newText": "import test/project1;\n" + } + ] + }, + { + "label": "test/local_project2", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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": "ARR", + "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": "map", + "kind": "Unit", + "detail": "type", + "sortText": "ARR", + "insertText": "map", + "insertTextFormat": "Snippet" + }, + { + "label": "object", + "kind": "Unit", + "detail": "type", + "sortText": "ARR", + "insertText": "object", + "insertTextFormat": "Snippet" + }, + { + "label": "stream", + "kind": "Unit", + "detail": "type", + "sortText": "ARR", + "insertText": "stream", + "insertTextFormat": "Snippet" + }, + { + "label": "table", + "kind": "Unit", + "detail": "type", + "sortText": "ARR", + "insertText": "table", + "insertTextFormat": "Snippet" + }, + { + "label": "transaction", + "kind": "Unit", + "detail": "type", + "sortText": "ARR", + "insertText": "transaction", + "insertTextFormat": "Snippet" + }, + { + "label": "service", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "service", + "insertText": "service", + "insertTextFormat": "Snippet" + }, + { + "label": "new", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "new", + "insertText": "new ", + "insertTextFormat": "Snippet" + }, + { + "label": "isolated", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "isolated", + "insertText": "isolated ", + "insertTextFormat": "Snippet" + }, + { + "label": "transactional", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "transactional", + "insertText": "transactional", + "insertTextFormat": "Snippet" + }, + { + "label": "function", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "function", + "insertText": "function ", + "insertTextFormat": "Snippet" + }, + { + "label": "let", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "let", + "insertText": "let", + "insertTextFormat": "Snippet" + }, + { + "label": "typeof", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "typeof", + "insertText": "typeof ", + "insertTextFormat": "Snippet" + }, + { + "label": "trap", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "trap", + "insertText": "trap", + "insertTextFormat": "Snippet" + }, + { + "label": "client", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "client", + "insertText": "client ", + "insertTextFormat": "Snippet" + }, + { + "label": "true", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "true", + "insertText": "true", + "insertTextFormat": "Snippet" + }, + { + "label": "false", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "false", + "insertText": "false", + "insertTextFormat": "Snippet" + }, + { + "label": "null", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "null", + "insertText": "null", + "insertTextFormat": "Snippet" + }, + { + "label": "check", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "check", + "insertText": "check ", + "insertTextFormat": "Snippet" + }, + { + "label": "checkpanic", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "checkpanic", + "insertText": "checkpanic ", + "insertTextFormat": "Snippet" + }, + { + "label": "is", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "is", + "insertText": "is", + "insertTextFormat": "Snippet" + }, + { + "label": "error constructor", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "ATP", + "filterText": "error", + "insertText": "error(\"${1}\")", + "insertTextFormat": "Snippet" + }, + { + "label": "object constructor", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "ATP", + "filterText": "object", + "insertText": "object {${1}}", + "insertTextFormat": "Snippet" + }, + { + "label": "base16", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "ATP", + "filterText": "base16", + "insertText": "base16 `${1}`", + "insertTextFormat": "Snippet" + }, + { + "label": "base64", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "ATP", + "filterText": "base64", + "insertText": "base64 `${1}`", + "insertTextFormat": "Snippet" + }, + { + "label": "from", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "AUQ", + "filterText": "from", + "insertText": "from ", + "insertTextFormat": "Snippet" + }, + { + "label": "StrandData", + "kind": "Struct", + "detail": "Record", + "documentation": { + "left": "Describes Strand execution details for the runtime.\n" + }, + "sortText": "BM", + "insertText": "StrandData", + "insertTextFormat": "Snippet" + }, + { + "label": "Thread", + "kind": "TypeParameter", + "detail": "Union", + "sortText": "BN", + "insertText": "Thread", + "insertTextFormat": "Snippet" + }, + { + "label": "ballerina/lang.regexp", + "kind": "Module", + "detail": "Module", + "sortText": "ARR", + "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": "re ``", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "ATP", + "filterText": "re ``", + "insertText": "re `${1}`", + "insertTextFormat": "Snippet" + }, + { + "label": "decimal", + "kind": "TypeParameter", + "detail": "Decimal", + "sortText": "BN", + "insertText": "decimal", + "insertTextFormat": "Snippet" + }, + { + "label": "error", + "kind": "Event", + "detail": "Error", + "sortText": "BL", + "insertText": "error", + "insertTextFormat": "Snippet" + }, + { + "label": "xml", + "kind": "TypeParameter", + "detail": "Xml", + "sortText": "BN", + "insertText": "xml", + "insertTextFormat": "Snippet" + }, + { + "label": "boolean", + "kind": "TypeParameter", + "detail": "Boolean", + "sortText": "BN", + "insertText": "boolean", + "insertTextFormat": "Snippet" + }, + { + "label": "future", + "kind": "TypeParameter", + "detail": "Future", + "sortText": "BN", + "insertText": "future", + "insertTextFormat": "Snippet" + }, + { + "label": "int", + "kind": "TypeParameter", + "detail": "Int", + "sortText": "BN", + "insertText": "int", + "insertTextFormat": "Snippet" + }, + { + "label": "float", + "kind": "TypeParameter", + "detail": "Float", + "sortText": "BN", + "insertText": "float", + "insertTextFormat": "Snippet" + }, + { + "label": "function", + "kind": "TypeParameter", + "detail": "Function", + "sortText": "BN", + "insertText": "function", + "insertTextFormat": "Snippet" + }, + { + "label": "string", + "kind": "TypeParameter", + "detail": "String", + "sortText": "BN", + "insertText": "string", + "insertTextFormat": "Snippet" + }, + { + "label": "typedesc", + "kind": "TypeParameter", + "detail": "Typedesc", + "sortText": "BN", + "insertText": "typedesc", + "insertTextFormat": "Snippet" + }, + { + "label": "readonly", + "kind": "TypeParameter", + "detail": "Readonly", + "sortText": "BN", + "insertText": "readonly", + "insertTextFormat": "Snippet" + }, + { + "label": "handle", + "kind": "TypeParameter", + "detail": "Handle", + "sortText": "BN", + "insertText": "handle", + "insertTextFormat": "Snippet" + }, + { + "label": "never", + "kind": "TypeParameter", + "detail": "Never", + "sortText": "BN", + "insertText": "never", + "insertTextFormat": "Snippet" + }, + { + "label": "json", + "kind": "TypeParameter", + "detail": "Json", + "sortText": "BN", + "insertText": "json", + "insertTextFormat": "Snippet" + }, + { + "label": "anydata", + "kind": "TypeParameter", + "detail": "Anydata", + "sortText": "BN", + "insertText": "anydata", + "insertTextFormat": "Snippet" + }, + { + "label": "any", + "kind": "TypeParameter", + "detail": "Any", + "sortText": "BN", + "insertText": "any", + "insertTextFormat": "Snippet" + }, + { + "label": "byte", + "kind": "TypeParameter", + "detail": "Byte", + "sortText": "BN", + "insertText": "byte", + "insertTextFormat": "Snippet" + }, + { + "label": "string ``", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "ATP", + "filterText": "string ``", + "insertText": "string `${1}`", + "insertTextFormat": "Snippet" + }, + { + "label": "xml ``", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "ATP", + "filterText": "xml ``", + "insertText": "xml `${1}`", + "insertTextFormat": "Snippet" + }, + { + "label": "dim2Arr", + "kind": "Variable", + "detail": "int[][]", + "sortText": "AFB", + "insertText": "dim2Arr", + "insertTextFormat": "Snippet" + }, + { + "label": "getArray()", + "kind": "Function", + "detail": "int[]", + "documentation": { + "right": { + "kind": "markdown", + "value": "**Package:** _._ \n \n \n \n \n**Return** `int[]` \n \n" + } + }, + "sortText": "AACC", + "filterText": "getArray", + "insertText": "getArray()", + "insertTextFormat": "Snippet" + }, + { + "label": "intArr1", + "kind": "Variable", + "detail": "int[]", + "sortText": "AABB", + "insertText": "intArr1", + "insertTextFormat": "Snippet" + }, + { + "label": "intArr3", + "kind": "Variable", + "detail": "int[][]", + "sortText": "AFB", + "insertText": "intArr3", + "insertTextFormat": "Snippet" + }, + { + "label": "arr", + "kind": "Variable", + "detail": "int[]", + "sortText": "AABB", + "insertText": "arr", + "insertTextFormat": "Snippet" + }, + { + "label": "a", + "kind": "Variable", + "detail": "string", + "sortText": "AFB", + "insertText": "a", + "insertTextFormat": "Snippet" + }, + { + "label": "getInt()", + "kind": "Function", + "detail": "int", + "documentation": { + "right": { + "kind": "markdown", + "value": "**Package:** _._ \n \n \n \n \n**Return** `int` \n \n" + } + }, + "sortText": "AGC", + "filterText": "getInt", + "insertText": "getInt()", + "insertTextFormat": "Snippet" + }, + { + "label": "main()", + "kind": "Function", + "detail": "()", + "documentation": { + "right": { + "kind": "markdown", + "value": "**Package:** _._ \n \n \n" + } + }, + "sortText": "AZDZ", + "filterText": "main", + "insertText": "main()", + "insertTextFormat": "Snippet" + }, + { + "label": "Dim1", + "kind": "TypeParameter", + "detail": "Array", + "sortText": "BN", + "insertText": "Dim1", + "insertTextFormat": "Snippet" + }, + { + "label": "intArr4", + "kind": "Variable", + "detail": "int[][]", + "sortText": "AFB", + "insertText": "intArr4", + "insertTextFormat": "Snippet" + }, + { + "label": "intArr2", + "kind": "Variable", + "detail": "int[]", + "sortText": "AABB", + "insertText": "intArr2", + "insertTextFormat": "Snippet" + }, + { + "label": "i", + "kind": "Variable", + "detail": "int", + "sortText": "AFB", + "insertText": "i", + "insertTextFormat": "Snippet" + }, + { + "label": "...dim2Arr", + "kind": "Variable", + "detail": "int[][]", + "sortText": "AAC", + "filterText": "dim2Arr", + "insertText": "...dim2Arr", + "insertTextFormat": "Snippet" + }, + { + "label": "...intArr3", + "kind": "Variable", + "detail": "int[][]", + "sortText": "AAC", + "filterText": "intArr3", + "insertText": "...intArr3", + "insertTextFormat": "Snippet" + }, + { + "label": "...intArr4", + "kind": "Variable", + "detail": "int[][]", + "sortText": "AAC", + "filterText": "intArr4", + "insertText": "...intArr4", + "insertTextFormat": "Snippet" + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config10.json b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config10.json index 3f3492596990..6a9305f4812b 100644 --- a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config10.json +++ b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config10.json @@ -51,7 +51,7 @@ "label": "...rec", "kind": "Variable", "detail": "TestRecord2", - "sortText": "AB", + "sortText": "AC", "filterText": "rec", "insertText": "...rec", "insertTextFormat": "Snippet" @@ -60,7 +60,7 @@ "label": "...rec1", "kind": "Variable", "detail": "TestRecord1", - "sortText": "F", + "sortText": "AC", "filterText": "rec1", "insertText": "...rec1", "insertTextFormat": "Snippet" diff --git a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config11.json b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config11.json index 8b70b814566e..13a8930877a0 100644 --- a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config11.json +++ b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config11.json @@ -51,7 +51,7 @@ "label": "...rec", "kind": "Variable", "detail": "TestRecord2", - "sortText": "AB", + "sortText": "AC", "filterText": "rec", "insertText": "...rec", "insertTextFormat": "Snippet" @@ -60,7 +60,7 @@ "label": "...rec1", "kind": "Variable", "detail": "TestRecord1", - "sortText": "AB", + "sortText": "AC", "filterText": "rec1", "insertText": "...rec1", "insertTextFormat": "Snippet" diff --git a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config12.json b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config12.json index 73a4ad804939..82cc7f1aae0c 100644 --- a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config12.json +++ b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config12.json @@ -34,7 +34,7 @@ "label": "...moduleRec", "kind": "Variable", "detail": "module1:TestRecord2", - "sortText": "AB", + "sortText": "AC", "filterText": "moduleRec", "insertText": "...moduleRec", "insertTextFormat": "Snippet" diff --git a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config20.json b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config20.json index 82446234dae6..9b69f8cfb58a 100644 --- a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config20.json +++ b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config20.json @@ -43,7 +43,7 @@ "label": "...testFunction()", "kind": "Function", "detail": "Record1", - "sortText": "AC", + "sortText": "AD", "filterText": "testFunction", "insertText": "...testFunction()", "insertTextFormat": "Snippet" diff --git a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config21.json b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config21.json index 56fe74ac0ad0..a0eb3dcdb0d0 100644 --- a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config21.json +++ b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config21.json @@ -51,7 +51,7 @@ "label": "...testFunction()", "kind": "Function", "detail": "record {|int field1; int field2; Record2 field3; anydata...;|}", - "sortText": "AC", + "sortText": "AD", "filterText": "testFunction", "insertText": "...testFunction()", "insertTextFormat": "Snippet" diff --git a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config25.json b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config25.json index 322fce37d249..1137481381c0 100644 --- a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config25.json +++ b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config25.json @@ -43,7 +43,7 @@ "label": "...testFunction()", "kind": "Function", "detail": "Employee", - "sortText": "AC", + "sortText": "AD", "filterText": "testFunction", "insertText": "...testFunction()", "insertTextFormat": "Snippet" diff --git a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config26.json b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config26.json index 5f2b15191d57..c421f5f366b6 100644 --- a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config26.json +++ b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config26.json @@ -43,7 +43,7 @@ "label": "...testFunction()", "kind": "Function", "detail": "Employee", - "sortText": "AC", + "sortText": "AD", "filterText": "testFunction", "insertText": "...testFunction()", "insertTextFormat": "Snippet" diff --git a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config35.json b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config35.json index 00cf8d61230a..70b16cdc1e68 100644 --- a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config35.json +++ b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config35.json @@ -43,7 +43,7 @@ "label": "...f", "kind": "Variable", "detail": "Foo", - "sortText": "AB", + "sortText": "AC", "filterText": "f", "insertText": "...f", "insertTextFormat": "Snippet" diff --git a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config36.json b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config36.json index 1c0a15bcf0d0..bc8f21322ea7 100644 --- a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config36.json +++ b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config36.json @@ -42,7 +42,7 @@ "label": "...rec", "kind": "Variable", "detail": "module1:TestRecord1", - "sortText": "AB", + "sortText": "AC", "filterText": "rec", "insertText": "...rec", "insertTextFormat": "Snippet" diff --git a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config37.json b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config37.json index a4e4227eed40..cb96fb41db67 100644 --- a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config37.json +++ b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config37.json @@ -123,7 +123,7 @@ "label": "...config", "kind": "Variable", "detail": "MyConfig", - "sortText": "AB", + "sortText": "AC", "filterText": "config", "insertText": "...config", "insertTextFormat": "Snippet" diff --git a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config42.json b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config42.json index e063152dbbf7..b7200ec0a5fc 100644 --- a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config42.json +++ b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config42.json @@ -43,7 +43,7 @@ "label": "...range", "kind": "Variable", "detail": "Range", - "sortText": "AB", + "sortText": "AC", "filterText": "range", "insertText": "...range", "insertTextFormat": "Snippet" diff --git a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config43.json b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config43.json index 4e8e19cbfd0c..ef9d8e8d09a8 100644 --- a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config43.json +++ b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config43.json @@ -43,7 +43,7 @@ "label": "...range", "kind": "Variable", "detail": "Range", - "sortText": "AB", + "sortText": "AC", "filterText": "range", "insertText": "...range", "insertTextFormat": "Snippet" diff --git a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config44.json b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config44.json index 76d350a3bac6..62598fce0766 100644 --- a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config44.json +++ b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config44.json @@ -43,7 +43,7 @@ "label": "...range", "kind": "Variable", "detail": "Range", - "sortText": "AB", + "sortText": "AC", "filterText": "range", "insertText": "...range", "insertTextFormat": "Snippet" diff --git a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config45.json b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config45.json index 7fafe9c1d23f..a792449686b5 100644 --- a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config45.json +++ b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config45.json @@ -43,7 +43,7 @@ "label": "...l1", "kind": "Variable", "detail": "LinkedList", - "sortText": "AB", + "sortText": "AC", "filterText": "l1", "insertText": "...l1", "insertTextFormat": "Snippet" diff --git a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config46.json b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config46.json index 650e5c362806..16516a362bae 100644 --- a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config46.json +++ b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config46.json @@ -26,7 +26,7 @@ "label": "...l1", "kind": "Variable", "detail": "LinkedList", - "sortText": "AB", + "sortText": "AC", "filterText": "l1", "insertText": "...l1", "insertTextFormat": "Snippet" diff --git a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config47.json b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config47.json index 941339a4b282..96d710ce0746 100644 --- a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config47.json +++ b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config47.json @@ -43,7 +43,7 @@ "label": "...l1", "kind": "Variable", "detail": "LinkedList", - "sortText": "AB", + "sortText": "AC", "filterText": "l1", "insertText": "...l1", "insertTextFormat": "Snippet" diff --git a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config50.json b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config50.json index ff1079e7e3aa..481b4d1a7888 100644 --- a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config50.json +++ b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config50.json @@ -4,7 +4,6 @@ "character": 12 }, "source": "expression_context/source/mapping_expr_ctx_source50.bal", - "description": "", "items": [ { "label": "readonly", @@ -35,7 +34,7 @@ "label": "...map1", "kind": "Variable", "detail": "map", - "sortText": "AB", + "sortText": "AC", "filterText": "map1", "insertText": "...map1", "insertTextFormat": "Snippet" diff --git a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config51.json b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config51.json index b3b0777341f8..5275016bc7b5 100644 --- a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config51.json +++ b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config51.json @@ -64,7 +64,7 @@ "label": "...b", "kind": "Variable", "detail": "map", - "sortText": "AB", + "sortText": "AC", "filterText": "b", "insertText": "...b", "insertTextFormat": "Snippet" diff --git a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config66.json b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config66.json index 484169465980..0057655dcb76 100644 --- a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config66.json +++ b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config66.json @@ -35,7 +35,7 @@ "label": "...t", "kind": "Variable", "detail": "TableRec", - "sortText": "AB", + "sortText": "AC", "filterText": "t", "insertText": "...t", "insertTextFormat": "Snippet" diff --git a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config67.json b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config67.json index 84819297d714..a6f4d1995ccf 100644 --- a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config67.json +++ b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config67.json @@ -26,7 +26,7 @@ "label": "...a", "kind": "Variable", "detail": "A", - "sortText": "AB", + "sortText": "AC", "filterText": "a", "insertText": "...a", "insertTextFormat": "Snippet" @@ -35,7 +35,7 @@ "label": "...b", "kind": "Variable", "detail": "B", - "sortText": "AB", + "sortText": "AC", "filterText": "b", "insertText": "...b", "insertTextFormat": "Snippet" diff --git a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config69.json b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config69.json index 816759f592c4..1ce550efbc57 100644 --- a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config69.json +++ b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config69.json @@ -35,7 +35,7 @@ "label": "...map2", "kind": "Variable", "detail": "map", - "sortText": "AB", + "sortText": "AC", "filterText": "map2", "insertText": "...map2", "insertTextFormat": "Snippet" @@ -44,7 +44,7 @@ "label": "...map1", "kind": "Variable", "detail": "map", - "sortText": "AB", + "sortText": "AC", "filterText": "map1", "insertText": "...map1", "insertTextFormat": "Snippet" diff --git a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config71.json b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config71.json index 0c551bb9033b..f3bbc975814e 100644 --- a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config71.json +++ b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config71.json @@ -26,7 +26,7 @@ "label": "...a", "kind": "Variable", "detail": "A", - "sortText": "F", + "sortText": "AC", "filterText": "a", "insertText": "...a", "insertTextFormat": "Snippet" diff --git a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config72.json b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config72.json index baf08149c6bf..7eb2a26edeaa 100644 --- a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config72.json +++ b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config72.json @@ -18,7 +18,7 @@ "label": "...b", "kind": "Variable", "detail": "B", - "sortText": "AB", + "sortText": "AC", "filterText": "b", "insertText": "...b", "insertTextFormat": "Snippet" @@ -35,7 +35,7 @@ "label": "...a", "kind": "Variable", "detail": "A", - "sortText": "F", + "sortText": "AC", "filterText": "a", "insertText": "...a", "insertTextFormat": "Snippet" @@ -44,7 +44,7 @@ "label": "...getB(int field1, string field2, string field3)", "kind": "Function", "detail": "B", - "sortText": "AC", + "sortText": "AD", "filterText": "getB", "insertText": "...getB(${1})", "insertTextFormat": "Snippet" @@ -53,7 +53,7 @@ "label": "...getA(int field1, string field2)", "kind": "Function", "detail": "A", - "sortText": "G", + "sortText": "AD", "filterText": "getA", "insertText": "...getA(${1})", "insertTextFormat": "Snippet" diff --git a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config76.json b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config76.json index f7ea6efecc17..eeb33760a9e1 100644 --- a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config76.json +++ b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_config76.json @@ -18,7 +18,7 @@ "label": "...p", "kind": "Variable", "detail": "Test2", - "sortText": "AB", + "sortText": "AC", "filterText": "p", "insertText": "...p", "insertTextFormat": "Snippet" diff --git a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_json_any_nil_default_values1.json b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_json_any_nil_default_values1.json index fd44e9741d8f..f3eae6cd1060 100644 --- a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_json_any_nil_default_values1.json +++ b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/config/mapping_expr_ctx_json_any_nil_default_values1.json @@ -18,7 +18,7 @@ "label": "...a", "kind": "Variable", "detail": "A", - "sortText": "AB", + "sortText": "AC", "filterText": "a", "insertText": "...a", "insertTextFormat": "Snippet" diff --git a/language-server/modules/langserver-core/src/test/resources/completion/expression_context/source/list_constructor_ctx_source6.bal b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/source/list_constructor_ctx_source6.bal new file mode 100644 index 000000000000..8b6756dbe097 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/completion/expression_context/source/list_constructor_ctx_source6.bal @@ -0,0 +1,32 @@ +int[] arr = [1, 2, 3]; + +int[][] dim2Arr = [[1, 2, 3]]; + +int i = 10; + +string a = "Hello"; + +type Dim1 int[]; + +public function main() { + + int[] intArr1 = []; + + int[] intArr2 = [...arr, ]; + + int[][] intArr3 = [[]]; + + int[][] intArr4 = [...dim2Arr, ]; + + Dim1[] intArr5 = []; + + int[] intArr6 = [...]; +} + +function getArray() returns int[] { + +} + +function getInt() returns int { + +} diff --git a/language-server/modules/langserver-core/src/test/resources/completion/function_body/config/config16.json b/language-server/modules/langserver-core/src/test/resources/completion/function_body/config/config16.json new file mode 100644 index 000000000000..3b8de757522c --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/completion/function_body/config/config16.json @@ -0,0 +1,309 @@ +{ + "position": { + "line": 3, + "character": 12 + }, + "source": "function_body/source/source16.bal", + "description": "Test completions after qualified name in function body block", + "items": [ + { + "label": "TEST_INT_CONST1", + "kind": "Variable", + "detail": "1", + "documentation": { + "right": { + "kind": "markdown", + "value": "" + } + }, + "sortText": "C", + "insertText": "TEST_INT_CONST1", + "insertTextFormat": "Snippet" + }, + { + "label": "TEST_STRING_CONST1", + "kind": "Variable", + "detail": "\"HELLO WORLD\"", + "documentation": { + "right": { + "kind": "markdown", + "value": "" + } + }, + "sortText": "C", + "insertText": "TEST_STRING_CONST1", + "insertTextFormat": "Snippet" + }, + { + "label": "ENUM1_FIELD1", + "kind": "EnumMember", + "detail": "\"ENUM1_FIELD1\"", + "documentation": { + "right": { + "kind": "markdown", + "value": "" + } + }, + "sortText": "H", + "insertText": "ENUM1_FIELD1", + "insertTextFormat": "Snippet" + }, + { + "label": "AnnotationType", + "kind": "Struct", + "detail": "Record", + "sortText": "M", + "insertText": "AnnotationType", + "insertTextFormat": "Snippet" + }, + { + "label": "ResponseMessage", + "kind": "Enum", + "detail": "Union", + "documentation": { + "left": "The types of messages that are accepted by HTTP `listener` when sending out the outbound response." + }, + "sortText": "I", + "insertText": "ResponseMessage", + "insertTextFormat": "Snippet" + }, + { + "label": "RequestMessage", + "kind": "Enum", + "detail": "Union", + "documentation": { + "left": "The types of messages that are accepted by HTTP `client` when sending out the outbound request." + }, + "sortText": "I", + "insertText": "RequestMessage", + "insertTextFormat": "Snippet" + }, + { + "label": "TargetType", + "kind": "TypeParameter", + "detail": "Typedesc", + "documentation": { + "left": "The types of data values that are expected by the `client` to return after the data binding operation." + }, + "sortText": "N", + "insertText": "TargetType", + "insertTextFormat": "Snippet" + }, + { + "label": "ClientError", + "kind": "Event", + "detail": "Error", + "documentation": { + "left": "Defines the possible client error types." + }, + "sortText": "L", + "insertText": "ClientError", + "insertTextFormat": "Snippet" + }, + { + "label": "TargetType2", + "kind": "TypeParameter", + "detail": "Typedesc", + "documentation": { + "left": "The super type of all the types." + }, + "sortText": "N", + "insertText": "TargetType2", + "insertTextFormat": "Snippet" + }, + { + "label": "TestEnum1", + "kind": "Enum", + "detail": "enum", + "sortText": "I", + "insertText": "TestEnum1", + "insertTextFormat": "Snippet" + }, + { + "label": "TestRecord1", + "kind": "Struct", + "detail": "Record", + "sortText": "M", + "insertText": "TestRecord1", + "insertTextFormat": "Snippet" + }, + { + "label": "TestRecord2", + "kind": "Struct", + "detail": "Record", + "sortText": "M", + "insertText": "TestRecord2", + "insertTextFormat": "Snippet" + }, + { + "label": "TestMap2", + "kind": "TypeParameter", + "detail": "Map", + "sortText": "N", + "insertText": "TestMap2", + "insertTextFormat": "Snippet" + }, + { + "label": "TestMap3", + "kind": "TypeParameter", + "detail": "Map", + "sortText": "N", + "insertText": "TestMap3", + "insertTextFormat": "Snippet" + }, + { + "label": "TestObject1", + "kind": "Interface", + "detail": "Object", + "sortText": "K", + "insertText": "TestObject1", + "insertTextFormat": "Snippet" + }, + { + "label": "ErrorOne", + "kind": "Event", + "detail": "Error", + "sortText": "L", + "insertText": "ErrorOne", + "insertTextFormat": "Snippet" + }, + { + "label": "ErrorTwo", + "kind": "Event", + "detail": "Error", + "sortText": "L", + "insertText": "ErrorTwo", + "insertTextFormat": "Snippet" + }, + { + "label": "Client", + "kind": "Interface", + "detail": "Class", + "documentation": { + "left": "The HTTP client provides the capability for initiating contact with a remote HTTP service. The API it\nprovides includes functions for the standard HTTP methods, forwarding a received request and sending requests\nusing custom HTTP verbs." + }, + "sortText": "K", + "insertText": "Client", + "insertTextFormat": "Snippet" + }, + { + "label": "Response", + "kind": "Interface", + "detail": "Class", + "documentation": { + "left": "Represents a response.\n" + }, + "sortText": "K", + "insertText": "Response", + "insertTextFormat": "Snippet" + }, + { + "label": "Listener", + "kind": "Interface", + "detail": "Class", + "sortText": "K", + "insertText": "Listener", + "insertTextFormat": "Snippet" + }, + { + "label": "TestClass1", + "kind": "Interface", + "detail": "Class", + "sortText": "K", + "insertText": "TestClass1", + "insertTextFormat": "Snippet" + }, + { + "label": "TEST_FUTURE_INT", + "kind": "Variable", + "detail": "future", + "sortText": "C", + "insertText": "TEST_FUTURE_INT", + "insertTextFormat": "Snippet" + }, + { + "label": "GLOBAL_VAR", + "kind": "Variable", + "detail": "int", + "sortText": "C", + "insertText": "GLOBAL_VAR", + "insertTextFormat": "Snippet" + }, + { + "label": "listener1", + "kind": "Variable", + "detail": "module1:Listener", + "sortText": "C", + "insertText": "listener1", + "insertTextFormat": "Snippet" + }, + { + "label": "function1()", + "kind": "Function", + "detail": "()", + "documentation": { + "right": { + "kind": "markdown", + "value": "**Package:** _ballerina/module1:0.1.0_ \n \n \n" + } + }, + "sortText": "A", + "filterText": "function1", + "insertText": "function1()", + "insertTextFormat": "Snippet" + }, + { + "label": "function2()", + "kind": "Function", + "detail": "()", + "documentation": { + "right": { + "kind": "markdown", + "value": "**Package:** _ballerina/module1:0.1.0_ \n \nThis is function2 \n" + } + }, + "sortText": "A", + "filterText": "function2", + "insertText": "function2()", + "insertTextFormat": "Snippet" + }, + { + "label": "function3(int param1, int param2, float... param3)", + "kind": "Function", + "detail": "int", + "documentation": { + "right": { + "kind": "markdown", + "value": "**Package:** _ballerina/module1:0.1.0_ \n \nThis is function3 with input parameters\n \n**Params** \n- `int` param1: param1 Parameter Description \n- `int` param2: param2 Parameter Description \n- `float[]` param3: param3 Parameter Description \n \n**Return** `int` \n- Return Value Description \n \n" + } + }, + "sortText": "A", + "filterText": "function3", + "insertText": "function3(${1})", + "insertTextFormat": "Snippet", + "command": { + "title": "editor.action.triggerParameterHints", + "command": "editor.action.triggerParameterHints" + } + }, + { + "label": "function4(int param1, int param2, string param3, float... param4)", + "kind": "Function", + "detail": "()", + "documentation": { + "right": { + "kind": "markdown", + "value": "**Package:** _ballerina/module1:0.1.0_ \n \nThis is function4 with input parameters\n \n**Params** \n- `int` param1: param1 Parameter Description \n- `int` param2: param2 Parameter Description \n- `string` param3: param3 Parameter Description(Defaultable) \n- `float[]` param4: param4 Parameter Description" + } + }, + "sortText": "A", + "filterText": "function4", + "insertText": "function4(${1})", + "insertTextFormat": "Snippet", + "command": { + "title": "editor.action.triggerParameterHints", + "command": "editor.action.triggerParameterHints" + } + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/completion/function_body/config/config17.json b/language-server/modules/langserver-core/src/test/resources/completion/function_body/config/config17.json new file mode 100644 index 000000000000..262d8afe3d0f --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/completion/function_body/config/config17.json @@ -0,0 +1,309 @@ +{ + "position": { + "line": 3, + "character": 13 + }, + "source": "function_body/source/source17.bal", + "description": "Test completions after qualified name in function body block", + "items": [ + { + "label": "TEST_INT_CONST1", + "kind": "Variable", + "detail": "1", + "documentation": { + "right": { + "kind": "markdown", + "value": "" + } + }, + "sortText": "C", + "insertText": "TEST_INT_CONST1", + "insertTextFormat": "Snippet" + }, + { + "label": "TEST_STRING_CONST1", + "kind": "Variable", + "detail": "\"HELLO WORLD\"", + "documentation": { + "right": { + "kind": "markdown", + "value": "" + } + }, + "sortText": "C", + "insertText": "TEST_STRING_CONST1", + "insertTextFormat": "Snippet" + }, + { + "label": "ENUM1_FIELD1", + "kind": "EnumMember", + "detail": "\"ENUM1_FIELD1\"", + "documentation": { + "right": { + "kind": "markdown", + "value": "" + } + }, + "sortText": "H", + "insertText": "ENUM1_FIELD1", + "insertTextFormat": "Snippet" + }, + { + "label": "AnnotationType", + "kind": "Struct", + "detail": "Record", + "sortText": "M", + "insertText": "AnnotationType", + "insertTextFormat": "Snippet" + }, + { + "label": "ResponseMessage", + "kind": "Enum", + "detail": "Union", + "documentation": { + "left": "The types of messages that are accepted by HTTP `listener` when sending out the outbound response." + }, + "sortText": "I", + "insertText": "ResponseMessage", + "insertTextFormat": "Snippet" + }, + { + "label": "RequestMessage", + "kind": "Enum", + "detail": "Union", + "documentation": { + "left": "The types of messages that are accepted by HTTP `client` when sending out the outbound request." + }, + "sortText": "I", + "insertText": "RequestMessage", + "insertTextFormat": "Snippet" + }, + { + "label": "TargetType", + "kind": "TypeParameter", + "detail": "Typedesc", + "documentation": { + "left": "The types of data values that are expected by the `client` to return after the data binding operation." + }, + "sortText": "N", + "insertText": "TargetType", + "insertTextFormat": "Snippet" + }, + { + "label": "ClientError", + "kind": "Event", + "detail": "Error", + "documentation": { + "left": "Defines the possible client error types." + }, + "sortText": "L", + "insertText": "ClientError", + "insertTextFormat": "Snippet" + }, + { + "label": "TargetType2", + "kind": "TypeParameter", + "detail": "Typedesc", + "documentation": { + "left": "The super type of all the types." + }, + "sortText": "N", + "insertText": "TargetType2", + "insertTextFormat": "Snippet" + }, + { + "label": "TestEnum1", + "kind": "Enum", + "detail": "enum", + "sortText": "I", + "insertText": "TestEnum1", + "insertTextFormat": "Snippet" + }, + { + "label": "TestRecord1", + "kind": "Struct", + "detail": "Record", + "sortText": "M", + "insertText": "TestRecord1", + "insertTextFormat": "Snippet" + }, + { + "label": "TestRecord2", + "kind": "Struct", + "detail": "Record", + "sortText": "M", + "insertText": "TestRecord2", + "insertTextFormat": "Snippet" + }, + { + "label": "TestMap2", + "kind": "TypeParameter", + "detail": "Map", + "sortText": "N", + "insertText": "TestMap2", + "insertTextFormat": "Snippet" + }, + { + "label": "TestMap3", + "kind": "TypeParameter", + "detail": "Map", + "sortText": "N", + "insertText": "TestMap3", + "insertTextFormat": "Snippet" + }, + { + "label": "TestObject1", + "kind": "Interface", + "detail": "Object", + "sortText": "K", + "insertText": "TestObject1", + "insertTextFormat": "Snippet" + }, + { + "label": "ErrorOne", + "kind": "Event", + "detail": "Error", + "sortText": "L", + "insertText": "ErrorOne", + "insertTextFormat": "Snippet" + }, + { + "label": "ErrorTwo", + "kind": "Event", + "detail": "Error", + "sortText": "L", + "insertText": "ErrorTwo", + "insertTextFormat": "Snippet" + }, + { + "label": "Client", + "kind": "Interface", + "detail": "Class", + "documentation": { + "left": "The HTTP client provides the capability for initiating contact with a remote HTTP service. The API it\nprovides includes functions for the standard HTTP methods, forwarding a received request and sending requests\nusing custom HTTP verbs." + }, + "sortText": "K", + "insertText": "Client", + "insertTextFormat": "Snippet" + }, + { + "label": "Response", + "kind": "Interface", + "detail": "Class", + "documentation": { + "left": "Represents a response.\n" + }, + "sortText": "K", + "insertText": "Response", + "insertTextFormat": "Snippet" + }, + { + "label": "Listener", + "kind": "Interface", + "detail": "Class", + "sortText": "K", + "insertText": "Listener", + "insertTextFormat": "Snippet" + }, + { + "label": "TestClass1", + "kind": "Interface", + "detail": "Class", + "sortText": "K", + "insertText": "TestClass1", + "insertTextFormat": "Snippet" + }, + { + "label": "TEST_FUTURE_INT", + "kind": "Variable", + "detail": "future", + "sortText": "C", + "insertText": "TEST_FUTURE_INT", + "insertTextFormat": "Snippet" + }, + { + "label": "GLOBAL_VAR", + "kind": "Variable", + "detail": "int", + "sortText": "C", + "insertText": "GLOBAL_VAR", + "insertTextFormat": "Snippet" + }, + { + "label": "listener1", + "kind": "Variable", + "detail": "module1:Listener", + "sortText": "C", + "insertText": "listener1", + "insertTextFormat": "Snippet" + }, + { + "label": "function1()", + "kind": "Function", + "detail": "()", + "documentation": { + "right": { + "kind": "markdown", + "value": "**Package:** _ballerina/module1:0.1.0_ \n \n \n" + } + }, + "sortText": "A", + "filterText": "function1", + "insertText": "function1()", + "insertTextFormat": "Snippet" + }, + { + "label": "function2()", + "kind": "Function", + "detail": "()", + "documentation": { + "right": { + "kind": "markdown", + "value": "**Package:** _ballerina/module1:0.1.0_ \n \nThis is function2 \n" + } + }, + "sortText": "A", + "filterText": "function2", + "insertText": "function2()", + "insertTextFormat": "Snippet" + }, + { + "label": "function3(int param1, int param2, float... param3)", + "kind": "Function", + "detail": "int", + "documentation": { + "right": { + "kind": "markdown", + "value": "**Package:** _ballerina/module1:0.1.0_ \n \nThis is function3 with input parameters\n \n**Params** \n- `int` param1: param1 Parameter Description \n- `int` param2: param2 Parameter Description \n- `float[]` param3: param3 Parameter Description \n \n**Return** `int` \n- Return Value Description \n \n" + } + }, + "sortText": "A", + "filterText": "function3", + "insertText": "function3(${1})", + "insertTextFormat": "Snippet", + "command": { + "title": "editor.action.triggerParameterHints", + "command": "editor.action.triggerParameterHints" + } + }, + { + "label": "function4(int param1, int param2, string param3, float... param4)", + "kind": "Function", + "detail": "()", + "documentation": { + "right": { + "kind": "markdown", + "value": "**Package:** _ballerina/module1:0.1.0_ \n \nThis is function4 with input parameters\n \n**Params** \n- `int` param1: param1 Parameter Description \n- `int` param2: param2 Parameter Description \n- `string` param3: param3 Parameter Description(Defaultable) \n- `float[]` param4: param4 Parameter Description" + } + }, + "sortText": "A", + "filterText": "function4", + "insertText": "function4(${1})", + "insertTextFormat": "Snippet", + "command": { + "title": "editor.action.triggerParameterHints", + "command": "editor.action.triggerParameterHints" + } + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/completion/function_body/source/source16.bal b/language-server/modules/langserver-core/src/test/resources/completion/function_body/source/source16.bal new file mode 100644 index 000000000000..a976ed6b8699 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/completion/function_body/source/source16.bal @@ -0,0 +1,7 @@ +import ballerina/module1; + +public function main() { + module1: + + map data = {}; +} diff --git a/language-server/modules/langserver-core/src/test/resources/completion/function_body/source/source17.bal b/language-server/modules/langserver-core/src/test/resources/completion/function_body/source/source17.bal new file mode 100644 index 000000000000..c13002e5af40 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/completion/function_body/source/source17.bal @@ -0,0 +1,7 @@ +import ballerina/module1; + +public function main() { + module1:T + + map data = {}; +} diff --git a/language-server/modules/langserver-core/src/test/resources/completion/import_decl/config/import_decl_with_ballerinax_org.json b/language-server/modules/langserver-core/src/test/resources/completion/import_decl/config/import_decl_with_ballerinax_org.json index 7c3778bfeded..e25fe8bb39b7 100644 --- a/language-server/modules/langserver-core/src/test/resources/completion/import_decl/config/import_decl_with_ballerinax_org.json +++ b/language-server/modules/langserver-core/src/test/resources/completion/import_decl/config/import_decl_with_ballerinax_org.json @@ -4,7 +4,7 @@ "character": 18 }, "source": "import_decl/source/import_decl_with_ballerinax_org.bal", - "description": "", + "description": "Test completions for ballerinax packages", "items": [ { "label": "azure.ad", diff --git a/language-server/modules/langserver-core/src/test/resources/completion/import_decl/config/import_decl_with_ballerinax_org2.json b/language-server/modules/langserver-core/src/test/resources/completion/import_decl/config/import_decl_with_ballerinax_org2.json new file mode 100644 index 000000000000..1459ef4ee62f --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/completion/import_decl/config/import_decl_with_ballerinax_org2.json @@ -0,0 +1,26 @@ +{ + "position": { + "line": 0, + "character": 20 + }, + "source": "import_decl/source/import_decl_with_ballerinax_org2.bal", + "description": "Test completions for ballerinax packages", + "items": [ + { + "label": "azure.ad", + "kind": "Module", + "detail": "Module", + "sortText": "D", + "insertText": "azure.ad", + "insertTextFormat": "Snippet" + }, + { + "label": "azure.qnamaker", + "kind": "Module", + "detail": "Module", + "sortText": "D", + "insertText": "azure.qnamaker", + "insertTextFormat": "Snippet" + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/completion/import_decl/config/import_decl_with_ballerinax_org3.json b/language-server/modules/langserver-core/src/test/resources/completion/import_decl/config/import_decl_with_ballerinax_org3.json new file mode 100644 index 000000000000..51944bd5a5e1 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/completion/import_decl/config/import_decl_with_ballerinax_org3.json @@ -0,0 +1,56 @@ +{ + "position": { + "line": 0, + "character": 24 + }, + "source": "import_decl/source/import_decl_with_ballerinax_org3.bal", + "description": "Test completions for ballerinax packages", + "items": [ + { + "label": "azure.ad", + "kind": "Module", + "detail": "Module", + "sortText": "A", + "insertText": "azure.ad", + "insertTextFormat": "Snippet", + "additionalTextEdits": [ + { + "range": { + "start": { + "line": 0, + "character": 18 + }, + "end": { + "line": 1, + "character": 0 + } + }, + "newText": "" + } + ] + }, + { + "label": "azure.qnamaker", + "kind": "Module", + "detail": "Module", + "sortText": "A", + "insertText": "azure.qnamaker", + "insertTextFormat": "Snippet", + "additionalTextEdits": [ + { + "range": { + "start": { + "line": 0, + "character": 18 + }, + "end": { + "line": 1, + "character": 0 + } + }, + "newText": "" + } + ] + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/completion/import_decl/config/import_decl_with_ballerinax_org4.json b/language-server/modules/langserver-core/src/test/resources/completion/import_decl/config/import_decl_with_ballerinax_org4.json new file mode 100644 index 000000000000..9409a3f7e94e --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/completion/import_decl/config/import_decl_with_ballerinax_org4.json @@ -0,0 +1,33 @@ +{ + "position": { + "line": 0, + "character": 25 + }, + "source": "import_decl/source/import_decl_with_ballerinax_org4.bal", + "description": "Test completions for ballerinax packages", + "items": [ + { + "label": "azure.ad", + "kind": "Module", + "detail": "Module", + "sortText": "A", + "insertText": "azure.ad", + "insertTextFormat": "Snippet", + "additionalTextEdits": [ + { + "range": { + "start": { + "line": 0, + "character": 18 + }, + "end": { + "line": 0, + "character": 24 + } + }, + "newText": "" + } + ] + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/completion/import_decl/source/import_decl_with_ballerinax_org2.bal b/language-server/modules/langserver-core/src/test/resources/completion/import_decl/source/import_decl_with_ballerinax_org2.bal new file mode 100644 index 000000000000..40d1eb255e73 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/completion/import_decl/source/import_decl_with_ballerinax_org2.bal @@ -0,0 +1 @@ +import ballerinax/az diff --git a/language-server/modules/langserver-core/src/test/resources/completion/import_decl/source/import_decl_with_ballerinax_org3.bal b/language-server/modules/langserver-core/src/test/resources/completion/import_decl/source/import_decl_with_ballerinax_org3.bal new file mode 100644 index 000000000000..79ce6f8d5512 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/completion/import_decl/source/import_decl_with_ballerinax_org3.bal @@ -0,0 +1 @@ +import ballerinax/azure. diff --git a/language-server/modules/langserver-core/src/test/resources/completion/import_decl/source/import_decl_with_ballerinax_org4.bal b/language-server/modules/langserver-core/src/test/resources/completion/import_decl/source/import_decl_with_ballerinax_org4.bal new file mode 100644 index 000000000000..3187053e3f1b --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/completion/import_decl/source/import_decl_with_ballerinax_org4.bal @@ -0,0 +1 @@ +import ballerinax/azure.a 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/config18.json new file mode 100644 index 000000000000..cf924242df85 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/completion/module_part_context/config/config18.json @@ -0,0 +1,167 @@ +{ + "position": { + "line": 2, + "character": 8 + }, + "source": "module_part_context/source/source19.bal", + "description": "Test completions after qualified name in module part node", + "items": [ + { + "label": "AnnotationType", + "kind": "Struct", + "detail": "Record", + "sortText": "CA", + "insertText": "AnnotationType", + "insertTextFormat": "Snippet" + }, + { + "label": "ResponseMessage", + "kind": "Enum", + "detail": "Union", + "documentation": { + "left": "The types of messages that are accepted by HTTP `listener` when sending out the outbound response." + }, + "sortText": "CA", + "insertText": "ResponseMessage", + "insertTextFormat": "Snippet" + }, + { + "label": "RequestMessage", + "kind": "Enum", + "detail": "Union", + "documentation": { + "left": "The types of messages that are accepted by HTTP `client` when sending out the outbound request." + }, + "sortText": "CA", + "insertText": "RequestMessage", + "insertTextFormat": "Snippet" + }, + { + "label": "TargetType", + "kind": "TypeParameter", + "detail": "Typedesc", + "documentation": { + "left": "The types of data values that are expected by the `client` to return after the data binding operation." + }, + "sortText": "CA", + "insertText": "TargetType", + "insertTextFormat": "Snippet" + }, + { + "label": "ClientError", + "kind": "Event", + "detail": "Error", + "documentation": { + "left": "Defines the possible client error types." + }, + "sortText": "CA", + "insertText": "ClientError", + "insertTextFormat": "Snippet" + }, + { + "label": "TargetType2", + "kind": "TypeParameter", + "detail": "Typedesc", + "documentation": { + "left": "The super type of all the types." + }, + "sortText": "CA", + "insertText": "TargetType2", + "insertTextFormat": "Snippet" + }, + { + "label": "TestRecord1", + "kind": "Struct", + "detail": "Record", + "sortText": "CA", + "insertText": "TestRecord1", + "insertTextFormat": "Snippet" + }, + { + "label": "TestRecord2", + "kind": "Struct", + "detail": "Record", + "sortText": "CA", + "insertText": "TestRecord2", + "insertTextFormat": "Snippet" + }, + { + "label": "TestMap2", + "kind": "TypeParameter", + "detail": "Map", + "sortText": "CA", + "insertText": "TestMap2", + "insertTextFormat": "Snippet" + }, + { + "label": "TestMap3", + "kind": "TypeParameter", + "detail": "Map", + "sortText": "CA", + "insertText": "TestMap3", + "insertTextFormat": "Snippet" + }, + { + "label": "TestObject1", + "kind": "Interface", + "detail": "Object", + "sortText": "CA", + "insertText": "TestObject1", + "insertTextFormat": "Snippet" + }, + { + "label": "ErrorOne", + "kind": "Event", + "detail": "Error", + "sortText": "CA", + "insertText": "ErrorOne", + "insertTextFormat": "Snippet" + }, + { + "label": "ErrorTwo", + "kind": "Event", + "detail": "Error", + "sortText": "CA", + "insertText": "ErrorTwo", + "insertTextFormat": "Snippet" + }, + { + "label": "Client", + "kind": "Interface", + "detail": "Class", + "documentation": { + "left": "The HTTP client provides the capability for initiating contact with a remote HTTP service. The API it\nprovides includes functions for the standard HTTP methods, forwarding a received request and sending requests\nusing custom HTTP verbs." + }, + "sortText": "CA", + "insertText": "Client", + "insertTextFormat": "Snippet" + }, + { + "label": "Response", + "kind": "Interface", + "detail": "Class", + "documentation": { + "left": "Represents a response.\n" + }, + "sortText": "CA", + "insertText": "Response", + "insertTextFormat": "Snippet" + }, + { + "label": "Listener", + "kind": "Interface", + "detail": "Class", + "sortText": "CA", + "insertText": "Listener", + "insertTextFormat": "Snippet" + }, + { + "label": "TestClass1", + "kind": "Interface", + "detail": "Class", + "sortText": "CA", + "insertText": "TestClass1", + "insertTextFormat": "Snippet" + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/completion/module_part_context/source/source19.bal b/language-server/modules/langserver-core/src/test/resources/completion/module_part_context/source/source19.bal new file mode 100644 index 000000000000..26fcba739fae --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/completion/module_part_context/source/source19.bal @@ -0,0 +1,8 @@ +import ballerina/module1; + +module1: + +map data = {}; + +public function main() { +} diff --git a/language-server/modules/langserver-core/src/test/resources/completion/query_expression/config/query_expr_ctx_config32.json b/language-server/modules/langserver-core/src/test/resources/completion/query_expression/config/query_expr_ctx_config32.json new file mode 100644 index 000000000000..51f1c7b8ee66 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/completion/query_expression/config/query_expr_ctx_config32.json @@ -0,0 +1,136 @@ +{ + "position": { + "line": 3, + "character": 26 + }, + "source": "query_expression/source/query_expr_ctx_source32.bal", + "description": "", + "items": [ + { + "label": "where", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BQ", + "filterText": "where", + "insertText": "where ", + "insertTextFormat": "Snippet" + }, + { + "label": "let", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BQ", + "filterText": "let", + "insertText": "let", + "insertTextFormat": "Snippet" + }, + { + "label": "let clause", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "BP", + "filterText": "let", + "insertText": "let ${1:var} ${2:varName} = ${3}", + "insertTextFormat": "Snippet" + }, + { + "label": "outer", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BQ", + "filterText": "outer", + "insertText": "outer ", + "insertTextFormat": "Snippet" + }, + { + "label": "join", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BQ", + "filterText": "join", + "insertText": "join ", + "insertTextFormat": "Snippet" + }, + { + "label": "join clause", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "BP", + "filterText": "join", + "insertText": "join ${1:var} ${2:varName} in ${3:expr} on ${4:onExpr} equals ${5:equalsExpr}", + "insertTextFormat": "Snippet" + }, + { + "label": "order by", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BQ", + "filterText": "order by", + "insertText": "order by ", + "insertTextFormat": "Snippet" + }, + { + "label": "limit", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BQ", + "filterText": "limit", + "insertText": "limit ", + "insertTextFormat": "Snippet" + }, + { + "label": "do", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "BP", + "filterText": "do", + "insertText": "do {\n\t${1}\n}", + "insertTextFormat": "Snippet" + }, + { + "label": "select", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BQ", + "filterText": "select", + "insertText": "select ", + "insertTextFormat": "Snippet" + }, + { + "label": "from", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BQ", + "filterText": "from", + "insertText": "from ", + "insertTextFormat": "Snippet" + }, + { + "label": "group by", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BQ", + "filterText": "group by", + "insertText": "group by ", + "insertTextFormat": "Snippet" + }, + { + "label": "group by clause", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "BP", + "filterText": "group by", + "insertText": "group by ${1:var} ${2:item} = ${3}", + "insertTextFormat": "Snippet" + }, + { + "label": "collect", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BQ", + "filterText": "collect", + "insertText": "collect ", + "insertTextFormat": "Snippet" + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/completion/query_expression/config/query_expr_ctx_config33.json b/language-server/modules/langserver-core/src/test/resources/completion/query_expression/config/query_expr_ctx_config33.json new file mode 100644 index 000000000000..90571957eeac --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/completion/query_expression/config/query_expr_ctx_config33.json @@ -0,0 +1,136 @@ +{ + "position": { + "line": 5, + "character": 26 + }, + "source": "query_expression/source/query_expr_ctx_source33.bal", + "description": "", + "items": [ + { + "label": "where", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BQ", + "filterText": "where", + "insertText": "where ", + "insertTextFormat": "Snippet" + }, + { + "label": "let", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BQ", + "filterText": "let", + "insertText": "let", + "insertTextFormat": "Snippet" + }, + { + "label": "let clause", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "BP", + "filterText": "let", + "insertText": "let ${1:var} ${2:varName} = ${3}", + "insertTextFormat": "Snippet" + }, + { + "label": "outer", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BQ", + "filterText": "outer", + "insertText": "outer ", + "insertTextFormat": "Snippet" + }, + { + "label": "join", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BQ", + "filterText": "join", + "insertText": "join ", + "insertTextFormat": "Snippet" + }, + { + "label": "join clause", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "BP", + "filterText": "join", + "insertText": "join ${1:var} ${2:varName} in ${3:expr} on ${4:onExpr} equals ${5:equalsExpr}", + "insertTextFormat": "Snippet" + }, + { + "label": "order by", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BQ", + "filterText": "order by", + "insertText": "order by ", + "insertTextFormat": "Snippet" + }, + { + "label": "limit", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BQ", + "filterText": "limit", + "insertText": "limit ", + "insertTextFormat": "Snippet" + }, + { + "label": "do", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "BP", + "filterText": "do", + "insertText": "do {\n\t${1}\n}", + "insertTextFormat": "Snippet" + }, + { + "label": "select", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BQ", + "filterText": "select", + "insertText": "select ", + "insertTextFormat": "Snippet" + }, + { + "label": "from", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BQ", + "filterText": "from", + "insertText": "from ", + "insertTextFormat": "Snippet" + }, + { + "label": "group by", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BQ", + "filterText": "group by", + "insertText": "group by ", + "insertTextFormat": "Snippet" + }, + { + "label": "group by clause", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "BP", + "filterText": "group by", + "insertText": "group by ${1:var} ${2:item} = ${3}", + "insertTextFormat": "Snippet" + }, + { + "label": "collect", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BQ", + "filterText": "collect", + "insertText": "collect ", + "insertTextFormat": "Snippet" + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/completion/query_expression/config/query_expr_ctx_config34.json b/language-server/modules/langserver-core/src/test/resources/completion/query_expression/config/query_expr_ctx_config34.json new file mode 100644 index 000000000000..1f537cf7438a --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/completion/query_expression/config/query_expr_ctx_config34.json @@ -0,0 +1,136 @@ +{ + "position": { + "line": 9, + "character": 28 + }, + "source": "query_expression/source/query_expr_ctx_source34.bal", + "description": "", + "items": [ + { + "label": "where", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BQ", + "filterText": "where", + "insertText": "where ", + "insertTextFormat": "Snippet" + }, + { + "label": "let", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BQ", + "filterText": "let", + "insertText": "let", + "insertTextFormat": "Snippet" + }, + { + "label": "let clause", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "BP", + "filterText": "let", + "insertText": "let ${1:var} ${2:varName} = ${3}", + "insertTextFormat": "Snippet" + }, + { + "label": "outer", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BQ", + "filterText": "outer", + "insertText": "outer ", + "insertTextFormat": "Snippet" + }, + { + "label": "join", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BQ", + "filterText": "join", + "insertText": "join ", + "insertTextFormat": "Snippet" + }, + { + "label": "join clause", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "BP", + "filterText": "join", + "insertText": "join ${1:var} ${2:varName} in ${3:expr} on ${4:onExpr} equals ${5:equalsExpr}", + "insertTextFormat": "Snippet" + }, + { + "label": "order by", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BQ", + "filterText": "order by", + "insertText": "order by ", + "insertTextFormat": "Snippet" + }, + { + "label": "limit", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BQ", + "filterText": "limit", + "insertText": "limit ", + "insertTextFormat": "Snippet" + }, + { + "label": "do", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "BP", + "filterText": "do", + "insertText": "do {\n\t${1}\n}", + "insertTextFormat": "Snippet" + }, + { + "label": "select", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BQ", + "filterText": "select", + "insertText": "select ", + "insertTextFormat": "Snippet" + }, + { + "label": "from", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BQ", + "filterText": "from", + "insertText": "from ", + "insertTextFormat": "Snippet" + }, + { + "label": "group by", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BQ", + "filterText": "group by", + "insertText": "group by ", + "insertTextFormat": "Snippet" + }, + { + "label": "group by clause", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "BP", + "filterText": "group by", + "insertText": "group by ${1:var} ${2:item} = ${3}", + "insertTextFormat": "Snippet" + }, + { + "label": "collect", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BQ", + "filterText": "collect", + "insertText": "collect ", + "insertTextFormat": "Snippet" + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/completion/query_expression/config/query_expr_ctx_config35.json b/language-server/modules/langserver-core/src/test/resources/completion/query_expression/config/query_expr_ctx_config35.json new file mode 100644 index 000000000000..d5860708c363 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/completion/query_expression/config/query_expr_ctx_config35.json @@ -0,0 +1,567 @@ +{ + "position": { + "line": 9, + "character": 27 + }, + "source": "query_expression/source/query_expr_ctx_source35.bal", + "description": "", + "items": [ + { + "label": "StrandData", + "kind": "Struct", + "detail": "Record", + "documentation": { + "left": "Describes Strand execution details for the runtime.\n" + }, + "sortText": "BBM", + "insertText": "StrandData", + "insertTextFormat": "Snippet" + }, + { + "label": "Thread", + "kind": "TypeParameter", + "detail": "Union", + "sortText": "BBN", + "insertText": "Thread", + "insertTextFormat": "Snippet" + }, + { + "label": "Student", + "kind": "Struct", + "detail": "Record", + "sortText": "BAM", + "insertText": "Student", + "insertTextFormat": "Snippet" + }, + { + "label": "readonly", + "kind": "TypeParameter", + "detail": "Readonly", + "sortText": "BBN", + "insertText": "readonly", + "insertTextFormat": "Snippet" + }, + { + "label": "handle", + "kind": "TypeParameter", + "detail": "Handle", + "sortText": "BBN", + "insertText": "handle", + "insertTextFormat": "Snippet" + }, + { + "label": "never", + "kind": "TypeParameter", + "detail": "Never", + "sortText": "ABN", + "insertText": "never", + "insertTextFormat": "Snippet" + }, + { + "label": "json", + "kind": "TypeParameter", + "detail": "Json", + "sortText": "BBN", + "insertText": "json", + "insertTextFormat": "Snippet" + }, + { + "label": "anydata", + "kind": "TypeParameter", + "detail": "Anydata", + "sortText": "BBN", + "insertText": "anydata", + "insertTextFormat": "Snippet" + }, + { + "label": "any", + "kind": "TypeParameter", + "detail": "Any", + "sortText": "BBN", + "insertText": "any", + "insertTextFormat": "Snippet" + }, + { + "label": "byte", + "kind": "TypeParameter", + "detail": "Byte", + "sortText": "ABN", + "insertText": "byte", + "insertTextFormat": "Snippet" + }, + { + "label": "service", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BZ", + "filterText": "service", + "insertText": "service", + "insertTextFormat": "Snippet" + }, + { + "label": "record", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BZ", + "filterText": "record", + "insertText": "record ", + "insertTextFormat": "Snippet" + }, + { + "label": "function", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BZ", + "filterText": "function", + "insertText": "function ", + "insertTextFormat": "Snippet" + }, + { + "label": "record {}", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "BX", + "filterText": "record", + "insertText": "record {${1}}", + "insertTextFormat": "Snippet" + }, + { + "label": "record {||}", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "BX", + "filterText": "record", + "insertText": "record {|${1}|}", + "insertTextFormat": "Snippet" + }, + { + "label": "distinct", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BZ", + "filterText": "distinct", + "insertText": "distinct", + "insertTextFormat": "Snippet" + }, + { + "label": "object {}", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "BX", + "filterText": "object", + "insertText": "object {${1}}", + "insertTextFormat": "Snippet" + }, + { + "label": "true", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BZ", + "filterText": "true", + "insertText": "true", + "insertTextFormat": "Snippet" + }, + { + "label": "false", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BZ", + "filterText": "false", + "insertText": "false", + "insertTextFormat": "Snippet" + }, + { + "label": "null", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BZ", + "filterText": "null", + "insertText": "null", + "insertTextFormat": "Snippet" + }, + { + "label": "test/project2", + "kind": "Module", + "detail": "Module", + "sortText": "BCG", + "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": "BCG", + "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": "BCE", + "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": "BCE", + "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": "BCF", + "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": "BCE", + "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": "BCG", + "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": "BCG", + "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": "BCE", + "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": "BCF", + "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": "BCE", + "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": "BBN", + "insertText": "decimal", + "insertTextFormat": "Snippet" + }, + { + "label": "error", + "kind": "Event", + "detail": "Error", + "sortText": "BBL", + "insertText": "error", + "insertTextFormat": "Snippet" + }, + { + "label": "object", + "kind": "Unit", + "detail": "type", + "sortText": "BG", + "insertText": "object", + "insertTextFormat": "Snippet" + }, + { + "label": "transaction", + "kind": "Unit", + "detail": "type", + "sortText": "BG", + "insertText": "transaction", + "insertTextFormat": "Snippet" + }, + { + "label": "xml", + "kind": "TypeParameter", + "detail": "Xml", + "sortText": "BBN", + "insertText": "xml", + "insertTextFormat": "Snippet" + }, + { + "label": "table", + "kind": "Unit", + "detail": "type", + "sortText": "BG", + "insertText": "table", + "insertTextFormat": "Snippet" + }, + { + "label": "map", + "kind": "Unit", + "detail": "type", + "sortText": "BG", + "insertText": "map", + "insertTextFormat": "Snippet" + }, + { + "label": "stream", + "kind": "Unit", + "detail": "type", + "sortText": "BG", + "insertText": "stream", + "insertTextFormat": "Snippet" + }, + { + "label": "boolean", + "kind": "TypeParameter", + "detail": "Boolean", + "sortText": "BBN", + "insertText": "boolean", + "insertTextFormat": "Snippet" + }, + { + "label": "future", + "kind": "TypeParameter", + "detail": "Future", + "sortText": "BBN", + "insertText": "future", + "insertTextFormat": "Snippet" + }, + { + "label": "int", + "kind": "TypeParameter", + "detail": "Int", + "sortText": "ABN", + "insertText": "int", + "insertTextFormat": "Snippet" + }, + { + "label": "float", + "kind": "TypeParameter", + "detail": "Float", + "sortText": "BBN", + "insertText": "float", + "insertTextFormat": "Snippet" + }, + { + "label": "function", + "kind": "TypeParameter", + "detail": "Function", + "sortText": "BBN", + "insertText": "function", + "insertTextFormat": "Snippet" + }, + { + "label": "string", + "kind": "TypeParameter", + "detail": "String", + "sortText": "BBN", + "insertText": "string", + "insertTextFormat": "Snippet" + }, + { + "label": "typedesc", + "kind": "TypeParameter", + "detail": "Typedesc", + "sortText": "BBN", + "insertText": "typedesc", + "insertTextFormat": "Snippet" + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/completion/query_expression/config/query_expr_ctx_config36.json b/language-server/modules/langserver-core/src/test/resources/completion/query_expression/config/query_expr_ctx_config36.json new file mode 100644 index 000000000000..7d37100a5f86 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/completion/query_expression/config/query_expr_ctx_config36.json @@ -0,0 +1,136 @@ +{ + "position": { + "line": 9, + "character": 28 + }, + "source": "query_expression/source/query_expr_ctx_source36.bal", + "description": "", + "items": [ + { + "label": "where", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BQ", + "filterText": "where", + "insertText": "where ", + "insertTextFormat": "Snippet" + }, + { + "label": "let", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BQ", + "filterText": "let", + "insertText": "let", + "insertTextFormat": "Snippet" + }, + { + "label": "let clause", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "BP", + "filterText": "let", + "insertText": "let ${1:var} ${2:varName} = ${3}", + "insertTextFormat": "Snippet" + }, + { + "label": "outer", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BQ", + "filterText": "outer", + "insertText": "outer ", + "insertTextFormat": "Snippet" + }, + { + "label": "join", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BQ", + "filterText": "join", + "insertText": "join ", + "insertTextFormat": "Snippet" + }, + { + "label": "join clause", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "BP", + "filterText": "join", + "insertText": "join ${1:var} ${2:varName} in ${3:expr} on ${4:onExpr} equals ${5:equalsExpr}", + "insertTextFormat": "Snippet" + }, + { + "label": "order by", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BQ", + "filterText": "order by", + "insertText": "order by ", + "insertTextFormat": "Snippet" + }, + { + "label": "limit", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BQ", + "filterText": "limit", + "insertText": "limit ", + "insertTextFormat": "Snippet" + }, + { + "label": "do", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "BP", + "filterText": "do", + "insertText": "do {\n\t${1}\n}", + "insertTextFormat": "Snippet" + }, + { + "label": "select", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BQ", + "filterText": "select", + "insertText": "select ", + "insertTextFormat": "Snippet" + }, + { + "label": "from", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BQ", + "filterText": "from", + "insertText": "from ", + "insertTextFormat": "Snippet" + }, + { + "label": "group by", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BQ", + "filterText": "group by", + "insertText": "group by ", + "insertTextFormat": "Snippet" + }, + { + "label": "group by clause", + "kind": "Snippet", + "detail": "Snippet", + "sortText": "BP", + "filterText": "group by", + "insertText": "group by ${1:var} ${2:item} = ${3}", + "insertTextFormat": "Snippet" + }, + { + "label": "collect", + "kind": "Keyword", + "detail": "Keyword", + "sortText": "BQ", + "filterText": "collect", + "insertText": "collect ", + "insertTextFormat": "Snippet" + } + ] +} diff --git a/language-server/modules/langserver-core/src/test/resources/completion/query_expression/source/query_expr_ctx_source32.bal b/language-server/modules/langserver-core/src/test/resources/completion/query_expression/source/query_expr_ctx_source32.bal new file mode 100644 index 000000000000..9db56445b754 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/completion/query_expression/source/query_expr_ctx_source32.bal @@ -0,0 +1,5 @@ +function foo() { + int|string[] arr = [1, 3, 4, 5, 6]; + _ = from var item in arr + where item is int +} diff --git a/language-server/modules/langserver-core/src/test/resources/completion/query_expression/source/query_expr_ctx_source33.bal b/language-server/modules/langserver-core/src/test/resources/completion/query_expression/source/query_expr_ctx_source33.bal new file mode 100644 index 000000000000..cbda5675f602 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/completion/query_expression/source/query_expr_ctx_source33.bal @@ -0,0 +1,7 @@ +type INT int; + +function foo() { + int|string[] arr = [1, 3, 4, 5, 6]; + _ = from var item in arr + where item is INT +} diff --git a/language-server/modules/langserver-core/src/test/resources/completion/query_expression/source/query_expr_ctx_source34.bal b/language-server/modules/langserver-core/src/test/resources/completion/query_expression/source/query_expr_ctx_source34.bal new file mode 100644 index 000000000000..ba7fa745539e --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/completion/query_expression/source/query_expr_ctx_source34.bal @@ -0,0 +1,12 @@ +type Student record {| + int id; + string name; +|}; + +function foo() { + Student[] students = []; + _ = from var {id, name} in students + where name == "" + where id is int + +} diff --git a/language-server/modules/langserver-core/src/test/resources/completion/query_expression/source/query_expr_ctx_source35.bal b/language-server/modules/langserver-core/src/test/resources/completion/query_expression/source/query_expr_ctx_source35.bal new file mode 100644 index 000000000000..a7117debc453 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/completion/query_expression/source/query_expr_ctx_source35.bal @@ -0,0 +1,12 @@ +type Student record {| + int id; + string name; +|}; + +function foo() { + Student[] students = []; + _ = from var {id, name} in students + where name == "" + where id is int + +} diff --git a/language-server/modules/langserver-core/src/test/resources/completion/query_expression/source/query_expr_ctx_source36.bal b/language-server/modules/langserver-core/src/test/resources/completion/query_expression/source/query_expr_ctx_source36.bal new file mode 100644 index 000000000000..5fbad61cba16 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/completion/query_expression/source/query_expr_ctx_source36.bal @@ -0,0 +1,13 @@ +type Student record {| + int id; + string name; +|}; + +function foo() { + Student[] students = []; + _ = from var {id, name} in students + where name == "" + where id is int + + string s = ""; +} diff --git a/language-server/modules/langserver-core/src/test/resources/extensions/symbol/reoccurringTypes.bal b/language-server/modules/langserver-core/src/test/resources/extensions/symbol/reoccurringTypes.bal new file mode 100644 index 000000000000..addbf71e0230 --- /dev/null +++ b/language-server/modules/langserver-core/src/test/resources/extensions/symbol/reoccurringTypes.bal @@ -0,0 +1,14 @@ +public type IntOrString int|string; + +public type RecA record { + string name; +}; + +public type SampleRecord record {| + IntOrString[] field1?; + IntOrString[] field2?; + RecA rec1?; + RecA rec2?; +|}; + +function transform(string s) returns SampleRecord => {}; diff --git a/misc/diagram-util/src/main/java/org/ballerinalang/diagramutil/connector/models/connector/Type.java b/misc/diagram-util/src/main/java/org/ballerinalang/diagramutil/connector/models/connector/Type.java index 8b7c1bff5ef6..793ef033ddc9 100644 --- a/misc/diagram-util/src/main/java/org/ballerinalang/diagramutil/connector/models/connector/Type.java +++ b/misc/diagram-util/src/main/java/org/ballerinalang/diagramutil/connector/models/connector/Type.java @@ -383,10 +383,16 @@ private static Type getAlreadyVisitedType(Symbol symbol, String typeName, Visite if (visitedType.isCompleted()) { Type existingType = visitedType.getTypeNode(); if (getClone) { + if (existingType instanceof UnionType) { + return new UnionType((UnionType) existingType); + } return new Type(existingType.getName(), existingType.getTypeName(), existingType.isOptional(), existingType.getTypeInfo(), existingType.isDefaultable(), existingType.getDefaultValue(), existingType.getDisplayAnnotation(), existingType.getDocumentation()); } + if (existingType instanceof RecordType) { + return new RecordType((RecordType) existingType); + } return existingType; } else { Type type = new Type(); diff --git a/misc/diagram-util/src/main/java/org/ballerinalang/diagramutil/connector/models/connector/types/RecordType.java b/misc/diagram-util/src/main/java/org/ballerinalang/diagramutil/connector/models/connector/types/RecordType.java index b4b6335c3b68..c02bbe9eb775 100644 --- a/misc/diagram-util/src/main/java/org/ballerinalang/diagramutil/connector/models/connector/types/RecordType.java +++ b/misc/diagram-util/src/main/java/org/ballerinalang/diagramutil/connector/models/connector/types/RecordType.java @@ -51,4 +51,20 @@ public RecordType(List fields, Type restType) { this.hasRestType = true; } } + + public RecordType(RecordType recordType) { + this.typeName = recordType.typeName; + this.name = recordType.name; + this.fields = recordType.fields; + this.optional = recordType.optional; + this.typeInfo = recordType.typeInfo; + this.defaultable = recordType.defaultable; + this.defaultValue = recordType.defaultValue; + this.displayAnnotation = recordType.displayAnnotation; + this.documentation = recordType.documentation; + this.restType = recordType.restType; + if (restType != null) { + this.hasRestType = true; + } + } } diff --git a/misc/diagram-util/src/main/java/org/ballerinalang/diagramutil/connector/models/connector/types/UnionType.java b/misc/diagram-util/src/main/java/org/ballerinalang/diagramutil/connector/models/connector/types/UnionType.java index c0879477b448..811113666c12 100644 --- a/misc/diagram-util/src/main/java/org/ballerinalang/diagramutil/connector/models/connector/types/UnionType.java +++ b/misc/diagram-util/src/main/java/org/ballerinalang/diagramutil/connector/models/connector/types/UnionType.java @@ -39,4 +39,16 @@ public UnionType(List members) { this.typeName = "union"; this.members = members; } + + public UnionType(UnionType unionType) { + this.typeName = unionType.typeName; + this.members = unionType.members; + this.name = unionType.name; + this.optional = unionType.optional; + this.typeInfo = unionType.typeInfo; + this.defaultable = unionType.defaultable; + this.defaultValue = unionType.defaultValue; + this.displayAnnotation = unionType.displayAnnotation; + this.documentation = unionType.documentation; + } } diff --git a/misc/formatter/modules/formatter-core/src/test/java/org/ballerinalang/formatter/core/ParserTestFormatter.java b/misc/formatter/modules/formatter-core/src/test/java/org/ballerinalang/formatter/core/ParserTestFormatter.java index f5f70df79d0f..71e1fead4c16 100644 --- a/misc/formatter/modules/formatter-core/src/test/java/org/ballerinalang/formatter/core/ParserTestFormatter.java +++ b/misc/formatter/modules/formatter-core/src/test/java/org/ballerinalang/formatter/core/ParserTestFormatter.java @@ -70,7 +70,7 @@ public List skipList() { "float_literal_source_07.bal", "method_call_expr_source_03.bal", "method_call_expr_source_05.bal", - "qualified_identifier_assert_08.bal", + "qualified_identifier_source_08.bal", "conditional_expr_source_28.bal", "resiliency_source_04.bal", "record_type_def_source_14.bal", diff --git a/settings.gradle b/settings.gradle index 1c5ff54c68ec..7b4ee4a91ae7 100644 --- a/settings.gradle +++ b/settings.gradle @@ -97,7 +97,6 @@ include(':testerina:report-tools') include(':testerina-integration-test') include(':jballerina-debugger-integration-test') include(':language-server-integration-tests') -include(':language-server-simulator') // TODO: enable at 'dependsOn' of tools-intergration-tests // and 'mustRunAfter' of vs-code-pluggin @@ -244,7 +243,6 @@ project(':test-launch-listener-03').projectDir = file('tests/launch-listener-tes project(':test-launch-listener-04').projectDir = file('tests/launch-listener-test-util-libs/test-launch-listener-04') project(':jballerina-integration-test').projectDir = file('tests/jballerina-integration-test') project(':language-server-integration-tests').projectDir = file('tests/language-server-integration-tests') -project(':language-server-simulator').projectDir = file('tests/language-server-simulator') // project(':composer-integration-test').projectDir = file('tests/composer-integration-test') // project(':ballerina-tools-integration-test').projectDir = file('tests/ballerina-tools-integration-test') //project(':ballerina-stringutils').projectDir = file('stdlib/stringutils') diff --git a/tests/ballerina-compiler-api-test/src/test/java/io/ballerina/semantic/api/test/SymbolBIRTest.java b/tests/ballerina-compiler-api-test/src/test/java/io/ballerina/semantic/api/test/SymbolBIRTest.java index 50cfa0eb1cfa..895a47ded61e 100644 --- a/tests/ballerina-compiler-api-test/src/test/java/io/ballerina/semantic/api/test/SymbolBIRTest.java +++ b/tests/ballerina-compiler-api-test/src/test/java/io/ballerina/semantic/api/test/SymbolBIRTest.java @@ -58,11 +58,16 @@ import java.util.Objects; import java.util.Optional; +import static io.ballerina.compiler.api.symbols.Qualifier.CLIENT; +import static io.ballerina.compiler.api.symbols.Qualifier.DISTINCT; +import static io.ballerina.compiler.api.symbols.Qualifier.ISOLATED; +import static io.ballerina.compiler.api.symbols.Qualifier.SERVICE; import static io.ballerina.compiler.api.symbols.SymbolKind.ANNOTATION; import static io.ballerina.compiler.api.symbols.SymbolKind.CONSTANT; import static io.ballerina.compiler.api.symbols.SymbolKind.FUNCTION; import static io.ballerina.compiler.api.symbols.SymbolKind.MODULE; import static io.ballerina.compiler.api.symbols.SymbolKind.SERVICE_DECLARATION; +import static io.ballerina.compiler.api.symbols.SymbolKind.TYPE; import static io.ballerina.compiler.api.symbols.SymbolKind.TYPE_DEFINITION; import static io.ballerina.compiler.api.symbols.SymbolKind.VARIABLE; import static io.ballerina.compiler.api.symbols.TypeDescKind.INT; @@ -175,16 +180,15 @@ public void testSymbolLookupInBIR() { BallerinaModule fooModule = (BallerinaModule) symbolsInScope.stream() .filter(sym -> sym.getName().get().equals("testproject")).findAny().get(); - SemanticAPITestUtils.assertList(fooModule.functions(), List.of("loadHuman", + SemanticAPITestUtils.assertList(fooModule.functions(), List.of("loadHuman", "testAnonTypeDefSymbolsIsNotVisible", "add", "testFnA", "testFnB")); SemanticAPITestUtils.assertList(fooModule.constants(), List.of("RED", "GREEN", "BLUE", "PI", "TRUE", "FALSE")); - - SemanticAPITestUtils.assertList(fooModule.typeDefinitions(), List.of("HumanObj", "ApplicationResponseError", - "Person", "BasicType", "Digit", "FileNotFoundError", "EofError", "Error", "Pet", "Student", "Cat", - "Annot", "Detail", "Service", "FnTypeA", "FnTypeB", "Address")); - - - SemanticAPITestUtils.assertList(fooModule.classes(), List.of("PersonObj", "Dog", "EmployeeObj", "Human")); + SemanticAPITestUtils.assertList(fooModule.classes(), List.of("PersonObj", "Dog", "EmployeeObj", "Human", + "Client", "Response")); + SemanticAPITestUtils.assertList(fooModule.typeDefinitions(), List.of("HumanObj", "ApplicationResponseError", + "Person", "BasicType", "Digit", "FileNotFoundError", "EofError", "Error", "Pet", "Student", "Cat", + "Annot", "Detail", "Service", "FnTypeA", "FnTypeB", "Address", "InterceptorClient", + "InterceptorService")); SemanticAPITestUtils.assertList(fooModule.enums(), List.of("Colour")); List allSymbols = getSymbolNames(fooPkgSymbol, 0); @@ -318,8 +322,8 @@ public static void assertList(List actualValues, List expect for (SymbolInfo val : expectedValues) { assertTrue(actualValues.stream() - .anyMatch(sym -> val.equals(new SymbolInfo(sym.getName().get(), sym.kind()))), - "Symbol not found: " + val); + .anyMatch(sym -> val.equals(new SymbolInfo(sym.getName().get(), sym.kind()))), + "Symbol not found: " + val); } } @@ -433,4 +437,31 @@ public void testIntersectionTypeDefSymbolPosBIR() { assertEquals(lineRange.endLine().line(), 147); assertEquals(lineRange.endLine().offset(), 2); } + + @Test + public void testObjectTypeSymbolDefQualifiers() { + Project project = BCompileUtil.loadProject("test-src/object_symbol_qualifiers.bal"); + Document srcFile = getDocumentForSingleSource(project); + SemanticModel model = getDefaultModulesSemanticModel(project); + + Optional symbol = model.symbol(srcFile, from(19, 20)); + assertTrue(symbol.isPresent()); + Symbol sym = symbol.get(); + assertEquals(sym.kind(), TYPE); + TypeSymbol typeSymbol = ((TypeReferenceTypeSymbol) sym).typeDescriptor(); + assertEquals(typeSymbol.typeKind(), OBJECT); + ObjectTypeSymbol clientObjectTSymbol = (ObjectTypeSymbol) typeSymbol; + assertEquals(clientObjectTSymbol.qualifiers().size(), 3); + assertEquals(clientObjectTSymbol.qualifiers(), List.of(DISTINCT, ISOLATED, CLIENT)); + + symbol = model.symbol(srcFile, from(23, 23)); + assertTrue(symbol.isPresent()); + sym = symbol.get(); + assertEquals(sym.kind(), TYPE); + typeSymbol = ((TypeReferenceTypeSymbol) sym).typeDescriptor(); + assertEquals(typeSymbol.typeKind(), OBJECT); + ObjectTypeSymbol serviceObjectTSymbol = (ObjectTypeSymbol) typeSymbol; + assertEquals(serviceObjectTSymbol.qualifiers().size(), 3); + assertEquals(serviceObjectTSymbol.qualifiers(), List.of(DISTINCT, ISOLATED, SERVICE)); + } } diff --git a/tests/ballerina-compiler-api-test/src/test/java/io/ballerina/semantic/api/test/typeof/TypeOfRegressionTest.java b/tests/ballerina-compiler-api-test/src/test/java/io/ballerina/semantic/api/test/typeof/TypeOfRegressionTest.java index 7cdbd98c0ee1..a353005ce274 100644 --- a/tests/ballerina-compiler-api-test/src/test/java/io/ballerina/semantic/api/test/typeof/TypeOfRegressionTest.java +++ b/tests/ballerina-compiler-api-test/src/test/java/io/ballerina/semantic/api/test/typeof/TypeOfRegressionTest.java @@ -73,4 +73,14 @@ public void testLiteralType() { assertEquals(type.get().kind(), SymbolKind.TYPE); assertEquals(type.get().typeKind(), TypeDescKind.INT); } + + @Test + public void testResourcePathAccess() { + model = SemanticAPITestUtils.getDefaultModulesSemanticModel( + "test-src/regression-tests/typeof_resource_path_action.bal"); + + Optional type = model.typeOf(LineRange.from("typeof_resource_path_action.bal", + LinePosition.from(20, 31), LinePosition.from(20, 38))); + assertTrue(type.isEmpty()); + } } diff --git a/tests/ballerina-compiler-api-test/src/test/resources/test-src/object_symbol_qualifiers.bal b/tests/ballerina-compiler-api-test/src/test/resources/test-src/object_symbol_qualifiers.bal new file mode 100644 index 000000000000..f12945fc7a73 --- /dev/null +++ b/tests/ballerina-compiler-api-test/src/test/resources/test-src/object_symbol_qualifiers.bal @@ -0,0 +1,25 @@ +// Copyright (c) 2023, WSO2 LLC. (https://www.wso2.com). +// +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import testorg/testproject; + +function testInterceptorClient() { + testproject:InterceptorClient ic; +} + +function testInterceptorService() { + testproject:InterceptorService 'is; +} diff --git a/tests/ballerina-compiler-api-test/src/test/resources/test-src/regression-tests/typeof_resource_path_action.bal b/tests/ballerina-compiler-api-test/src/test/resources/test-src/regression-tests/typeof_resource_path_action.bal new file mode 100644 index 000000000000..62c5c6bd6f57 --- /dev/null +++ b/tests/ballerina-compiler-api-test/src/test/resources/test-src/regression-tests/typeof_resource_path_action.bal @@ -0,0 +1,22 @@ +// Copyright (c) 2023 WSO2 LLC. (http://www.wso2.org) All Rights Reserved. +// +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import testorg/testproject as tp; + +public function main() returns error? { + tp:Client cl = check new(""); + cl->path1/"id1"/path2/"id2".post(); +} diff --git a/tests/ballerina-compiler-api-test/src/test/resources/test-src/testproject/client.bal b/tests/ballerina-compiler-api-test/src/test/resources/test-src/testproject/client.bal new file mode 100644 index 000000000000..6b38fa63998f --- /dev/null +++ b/tests/ballerina-compiler-api-test/src/test/resources/test-src/testproject/client.bal @@ -0,0 +1,40 @@ +// Copyright (c) 2023 WSO2 LLC. (http://www.wso2.org) All Rights Reserved. +// +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +# + url - Target service url +public client class Client { + public string url; + + public function init(string url) { + self.url = url; + } + + # Sample resource method. + # + # + id1 - Path parameter + # + ids - Rest path parameter + # + str - Argument + # + ids2 - Rest argument + # + return - The response for the request + resource function post path1/[string id1]/path2/[string... ids](string str, string... ids2) returns Response { + return new Response(); + } +} + +public class Response { + public int statusCode = 200; + public string reasonPhrase = "Test Reason phrase"; +} diff --git a/tests/ballerina-compiler-api-test/src/test/resources/test-src/testproject/type_defs.bal b/tests/ballerina-compiler-api-test/src/test/resources/test-src/testproject/type_defs.bal index a59acbcbef46..b9eee1a9e21f 100644 --- a/tests/ballerina-compiler-api-test/src/test/resources/test-src/testproject/type_defs.bal +++ b/tests/ballerina-compiler-api-test/src/test/resources/test-src/testproject/type_defs.bal @@ -146,3 +146,11 @@ public type Address readonly & record { string street; string city; }; + +public type InterceptorClient distinct isolated client object { + isolated remote function execute() returns anydata|error; +}; + +public type InterceptorService distinct isolated service object { + isolated remote function execute() returns anydata|error; +}; diff --git a/tests/jballerina-benchmark-test/build.gradle b/tests/jballerina-benchmark-test/build.gradle index b99a573ba208..27087613bd23 100644 --- a/tests/jballerina-benchmark-test/build.gradle +++ b/tests/jballerina-benchmark-test/build.gradle @@ -115,3 +115,4 @@ test { } } +generateMetadataFileForMavenJavaPublication.dependsOn(copyToLib) diff --git a/tests/jballerina-integration-test/build.gradle b/tests/jballerina-integration-test/build.gradle index b352ecc00c69..79474e36dce9 100644 --- a/tests/jballerina-integration-test/build.gradle +++ b/tests/jballerina-integration-test/build.gradle @@ -131,3 +131,4 @@ task createLaunchListenerUtilsLib(type: Copy) { tasks.test.dependsOn(createLaunchListenerUtilsLib) tasks.compileTestJava.dependsOn(":ballerina-io-internal:copyInteropImports") +generateMetadataFileForMavenJavaPublication.dependsOn(copyToLib) diff --git a/tests/jballerina-unit-test/src/test/java/org/ballerinalang/nativeimpl/jvm/runtime/api/tests/Values.java b/tests/jballerina-unit-test/src/test/java/org/ballerinalang/nativeimpl/jvm/runtime/api/tests/Values.java index eb88e0a4d547..7a5403dedd75 100644 --- a/tests/jballerina-unit-test/src/test/java/org/ballerinalang/nativeimpl/jvm/runtime/api/tests/Values.java +++ b/tests/jballerina-unit-test/src/test/java/org/ballerinalang/nativeimpl/jvm/runtime/api/tests/Values.java @@ -477,6 +477,13 @@ public static BString getParameterNameFromResource(BTypedesc type) { return StringUtils.fromString(parameter.name); } + public static BString getParameterDefaultFunctionNameFromResource(BTypedesc type) { + BServiceType serviceType = (BServiceType) type.getDescribingType(); + ResourceMethodType resourceMethod = serviceType.getResourceMethods()[1]; + Parameter parameter = resourceMethod.getParameters()[0]; + return StringUtils.fromString(parameter.defaultFunctionName); + } + public static BArray getParamNamesFromObjectInit(BObject object) { ObjectType objectType = object.getType(); MethodType initMethodtype = objectType.getInitMethod(); diff --git a/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/bala/object/ObjectInBalaTest.java b/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/bala/object/ObjectInBalaTest.java index 645807e2842c..71f76129da9c 100644 --- a/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/bala/object/ObjectInBalaTest.java +++ b/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/bala/object/ObjectInBalaTest.java @@ -41,6 +41,7 @@ public void setup() { BCompileUtil.compileAndCacheBala("test-src/bala/test_projects/test_project"); BCompileUtil.compileAndCacheBala("test-src/bala/test_projects/test_project_two"); BCompileUtil.compileAndCacheBala("test-src/bala/test_projects/test_project_utils"); + BCompileUtil.compileAndCacheBala("test-src/bala/test_projects/bir_test_project"); result = BCompileUtil.compile("test-src/bala/test_bala/object/test_objects.bal"); } @@ -551,6 +552,31 @@ public void testObjectInclusionWithMethodWithParameters() { BRunUtil.invoke(result, "testObjectInclusionWithMethodWithParameters"); } + @Test (description = "Negative test to verify object qualifiers load properly from BIR") + public void testDistinctIsolatedObjectsNegative() { + CompileResult result = BCompileUtil.compile("test-src/bala/test_bala/object/test_bir_negative.bal"); + int i = 0; + BAssertUtil.validateError(result, i++, + "incompatible types: expected 'bir/objs:0.1.0:Foo', found 'bir/objs:0.1.0:Bar'", 24, 18); + BAssertUtil.validateError(result, i++, + "incompatible types: expected 'bir/objs:0.1.0:Bar', found 'bir/objs:0.1.0:Foo'", 28, 18); + BAssertUtil.validateError(result, i++, + "incompatible types: expected 'Foo', found 'bir/objs:0.1.0:Foo'", 29, 13); + BAssertUtil.validateError(result, i++, + "incompatible types: expected 'bir/objs:0.1.0:Qux', found 'bir/objs:0.1.0:Xyz'", 33, 18); + BAssertUtil.validateError(result, i++, + "incompatible types: expected 'bir/objs:0.1.0:Xyz', found 'bir/objs:0.1.0:Qux'", 37, 18); + BAssertUtil.validateError(result, i++, + "incompatible types: expected 'bir/objs:0.1.0:Foo', found 'Foo'", 41, 18); + Assert.assertEquals(result.getErrorCount(), i); + } + + @Test(description = "Positive test to verify object isolated and distinct qualifiers load properly from BIR") + public void testObjectTypeAssignabilityWithQualifiers() { + CompileResult result = BCompileUtil.compile("test-src/bala/test_bala/object/test_bir_positive.bal"); + BRunUtil.invoke(result, "testObjectTypeAssignabilityWithQualifiers"); + } + @AfterClass public void tearDown() { result = null; diff --git a/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/bir/BirVariableOptimizationTest.java b/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/bir/BirVariableOptimizationTest.java index 80c7596d8ad8..e01f368f85c9 100644 --- a/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/bir/BirVariableOptimizationTest.java +++ b/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/bir/BirVariableOptimizationTest.java @@ -25,7 +25,7 @@ import org.testng.annotations.Test; import org.wso2.ballerinalang.compiler.bir.emit.BIREmitter; import org.wso2.ballerinalang.compiler.bir.model.BIRNode; -import org.wso2.ballerinalang.compiler.bir.optimizer.LivenessAnalyzer; +import org.wso2.ballerinalang.compiler.bir.optimizer.BIROptimizer; import org.wso2.ballerinalang.compiler.util.CompilerContext; import java.io.IOException; @@ -36,7 +36,7 @@ import java.util.stream.Stream; /** - * Test to confirm the functionality of the {@link LivenessAnalyzer}. + * Test to confirm the functionality of the {@link BIROptimizer}. */ public class BirVariableOptimizationTest { private BIREmitter birEmitter; diff --git a/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/statements/arrays/ArrayInitializerExprTest.java b/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/statements/arrays/ArrayInitializerExprTest.java index 131a1ea2c6ae..c98288c554dc 100644 --- a/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/statements/arrays/ArrayInitializerExprTest.java +++ b/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/statements/arrays/ArrayInitializerExprTest.java @@ -159,6 +159,11 @@ public void testInferredArrayInitWithInGrpExpr() { BRunUtil.invoke(compileResult, "testInferredArrayInitWithInGrpExpr"); } + @Test + public void testArrayInitWithGlobalVars() { + BRunUtil.invoke(compileResult, "testArrayInitWithGlobalVars"); + } + @AfterClass public void tearDown() { compileResult = null; diff --git a/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/types/bytetype/BByteArrayValueNegativeTest.java b/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/types/bytetype/BByteArrayValueNegativeTest.java index a55003901839..8735b91ec501 100644 --- a/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/types/bytetype/BByteArrayValueNegativeTest.java +++ b/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/types/bytetype/BByteArrayValueNegativeTest.java @@ -33,44 +33,30 @@ public class BByteArrayValueNegativeTest { public void testBlobValueNegative() { CompileResult result = BCompileUtil.compile("test-src/types/byte/byte-array-value-negative.bal"); int index = 0; - BAssertUtil.validateError(result, index++, "incompatible types: expected 'byte[]', found 'other'", 2, 16); BAssertUtil.validateError(result, index++, "undefined symbol 'base1'", 2, 16); BAssertUtil.validateError(result, index++, "invalid expr in assignment lhs", 2, 22); BAssertUtil.validateError(result, index++, "missing semicolon token", 2, 22); - BAssertUtil.validateError(result, index++, "invalid literal for type 'other': raw templates can only " + - "be assigned to abstract subtypes of 'ballerina/lang.object:0.0.0:RawTemplate'", 2, 24); BAssertUtil.validateError(result, index++, "missing equal token", 2, 24); - BAssertUtil.validateError(result, index++, "incompatible types: expected 'byte[]', found 'other'", 3, 16); BAssertUtil.validateError(result, index++, "undefined symbol 'base'", 3, 16); BAssertUtil.validateError(result, index++, "invalid expr in assignment lhs", 3, 21); BAssertUtil.validateError(result, index++, "missing semicolon token", 3, 21); - BAssertUtil.validateError(result, index++, "invalid literal for type 'other': raw templates can only " + - "be assigned to abstract subtypes of 'ballerina/lang.object:0.0.0:RawTemplate'", 3, 24); BAssertUtil.validateError(result, index++, "missing equal token", 3, 24); BAssertUtil.validateError(result, index++, "invalid base16 content in byte array literal", 4, 24); BAssertUtil.validateError(result, index++, "invalid base16 content in byte array literal", 5, 24); BAssertUtil.validateError(result, index++, "invalid base16 content in byte array literal", 6, 24); BAssertUtil.validateError(result, index++, "invalid base16 content in byte array literal", 7, 24); - BAssertUtil.validateError(result, index++, "incompatible types: expected 'byte[]', found 'other'", 8, 16); BAssertUtil.validateError(result, index++, "missing byte array content", 8, 16); BAssertUtil.validateError(result, index++, "missing binary operator", 8, 23); - BAssertUtil.validateError(result, index++, "incompatible types: expected 'byte[]', found 'other'", 12, 16); BAssertUtil.validateError(result, index++, "undefined symbol 'base6'", 12, 16); BAssertUtil.validateError(result, index++, "invalid expr in assignment lhs", 12, 22); BAssertUtil.validateError(result, index++, "missing semicolon token", 12, 22); - BAssertUtil.validateError(result, index++, "invalid literal for type 'other': raw templates can only " + - "be assigned to abstract subtypes of 'ballerina/lang.object:0.0.0:RawTemplate'", 12, 24); BAssertUtil.validateError(result, index++, "missing equal token", 12, 24); - BAssertUtil.validateError(result, index++, "incompatible types: expected 'byte[]', found 'other'", 13, 16); BAssertUtil.validateError(result, index++, "undefined symbol 'base'", 13, 16); BAssertUtil.validateError(result, index++, "invalid expr in assignment lhs", 13, 21); BAssertUtil.validateError(result, index++, "missing semicolon token", 13, 21); - BAssertUtil.validateError(result, index++, "invalid literal for type 'other': raw templates can only " + - "be assigned to abstract subtypes of 'ballerina/lang.object:0.0.0:RawTemplate'", 13, 24); BAssertUtil.validateError(result, index++, "missing equal token", 13, 24); BAssertUtil.validateError(result, index++, "invalid base64 content in byte array literal", 14, 24); BAssertUtil.validateError(result, index++, "invalid base64 content in byte array literal", 15, 24); - BAssertUtil.validateError(result, index++, "incompatible types: expected 'byte[]', found 'other'", 16, 16); BAssertUtil.validateError(result, index++, "missing byte array content", 16, 16); BAssertUtil.validateError(result, index++, "missing binary operator", 16, 23); BAssertUtil.validateError(result, index++, "invalid base64 content in byte array literal", 17, 24); @@ -81,13 +67,11 @@ public void testBlobValueNegative() { BAssertUtil.validateError(result, index++, "incompatible types: expected 'int[2]', found 'byte[3]'", 30, 16); BAssertUtil.validateError(result, index++, "incompatible types: 'byte[2]' cannot be cast to " + "'(byte[3] & readonly)'", 33, 16); - BAssertUtil.validateError(result, index++, "incompatible types: expected 'byte[]', found 'other'", 33, 16); BAssertUtil.validateError(result, index++, "incompatible types: 'byte[3]' cannot be cast to " + "'(int[2] & readonly)'", 34, 15); - BAssertUtil.validateError(result, index++, "incompatible types: expected 'int[]', found 'other'", 34, 15); + BAssertUtil.validateError(result, index++, "incompatible types: 'byte[3]' cannot be cast to " + "'(string[] & readonly)'", 35, 18); - BAssertUtil.validateError(result, index++, "incompatible types: expected 'string[]', found 'other'", 35, 18); BAssertUtil.validateError(result, index++, "incompatible types: expected 'byte[3]', found 'byte[2]'", 39, 17); Assert.assertEquals(result.getErrorCount(), index); } diff --git a/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/types/constant/ConstantAssignmentTest.java b/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/types/constant/ConstantAssignmentTest.java index 567169ab32a9..a10511d9496c 100644 --- a/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/types/constant/ConstantAssignmentTest.java +++ b/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/types/constant/ConstantAssignmentTest.java @@ -131,6 +131,12 @@ public void testConstantAssignmentNegative() { "'record {| (record {| \"a\" a; |} & readonly) x; int i; |}'", 24, 55); BAssertUtil.validateError(negativeCompileResult, i++, "missing non-defaultable required record field 'a'", 26, 14); + BAssertUtil.validateError(negativeCompileResult, i++, + "incompatible types: expected 'string[]', found '[170,187]'", 28, 20); + BAssertUtil.validateError(negativeCompileResult, i++, + "incompatible types: expected '[string,int]', found '[170,187]'", 30, 26); + BAssertUtil.validateError(negativeCompileResult, i++, + "incompatible types: expected '[170]', found '[170,187]'", 32, 19); Assert.assertEquals(negativeCompileResult.getErrorCount(), i); } diff --git a/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/types/constant/ConstantTypeTest.java b/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/types/constant/ConstantTypeTest.java index a3b48d7468ee..7e41702477b9 100644 --- a/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/types/constant/ConstantTypeTest.java +++ b/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/types/constant/ConstantTypeTest.java @@ -53,7 +53,8 @@ public Object[] testFunctions() { "testTypesOfConstantMaps", "testConstTypesInline", "testInvalidRuntimeUpdateOfConstMaps", - "testResolvingConstValForConstantsOfUserDefinedTypes" + "testResolvingConstValForConstantsOfUserDefinedTypes", + "testConstByteArrLiteral" }; } diff --git a/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/types/table/TableValueAssignTest.java b/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/types/table/TableValueAssignTest.java index f399fe188c42..c1ee9e42ce51 100644 --- a/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/types/table/TableValueAssignTest.java +++ b/tests/jballerina-unit-test/src/test/java/org/ballerinalang/test/types/table/TableValueAssignTest.java @@ -53,7 +53,8 @@ public Object[] dataToTestAssignTableValue() { "testAssignKeylessTableValueToAny", "testAssignKeylessTableValueToVar", "testAssignKeylessTableValueToTableType", - "testTableVlueAssignmentToAny" + "testTableValueAssignmentToAny", + "testTableValueReturnFromFunction" }; } diff --git a/tests/jballerina-unit-test/src/test/resources/test-src/bala/test_bala/object/test_bir_negative.bal b/tests/jballerina-unit-test/src/test/resources/test-src/bala/test_bala/object/test_bir_negative.bal new file mode 100644 index 000000000000..cd632fc4acb2 --- /dev/null +++ b/tests/jballerina-unit-test/src/test/resources/test-src/bala/test_bala/object/test_bir_negative.bal @@ -0,0 +1,42 @@ +// Copyright (c) 2023 WSO2 LLC. (http://www.wso2.org) All Rights Reserved. +// +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import bir/objs; + +public type Foo distinct isolated client object { + public isolated function execute() returns anydata|error; +}; + +function f1(objs:Bar bar) { + objs:Foo _ = bar; +} + +function f2(objs:Foo foo) { + objs:Bar _ = foo; + Foo _ = foo; +} + +function f3(objs:Xyz xyz) { + objs:Qux _ = xyz; +} + +function f4(objs:Qux qux) { + objs:Xyz _ = qux; +} + +function f5(Foo foo) { + objs:Foo _ = foo; +} diff --git a/tests/jballerina-unit-test/src/test/resources/test-src/bala/test_bala/object/test_bir_positive.bal b/tests/jballerina-unit-test/src/test/resources/test-src/bala/test_bala/object/test_bir_positive.bal new file mode 100644 index 000000000000..53a7646e6d3c --- /dev/null +++ b/tests/jballerina-unit-test/src/test/resources/test-src/bala/test_bala/object/test_bir_positive.bal @@ -0,0 +1,110 @@ +// Copyright (c) 2023 WSO2 LLC. (http://www.wso2.org) All Rights Reserved. +// +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import bir/objs; + +public type Foo distinct isolated client object { + public isolated function execute() returns anydata|error; +}; + +public type Quxx isolated client object { + public isolated function execute() returns anydata|error; +}; + +objs:Qux quxMod = isolated service object { + public isolated function execute() returns anydata|error { + return "qux"; + } +}; + +function testObjectTypeAssignabilityWithQualifiers() { + objs:Foo foo = isolated client object { + public isolated function execute() returns anydata|error { + return "foo"; + } + }; + assertTrue(foo is objs:Foo); + assertTrue(foo is objs:Foo); + assertFalse(foo is objs:Bar); + assertFalse(foo is Foo); + + Foo foo2 = isolated client object { + public isolated function execute() returns anydata|error { + return "foo"; + } + }; + assertFalse(foo2 is objs:Foo); + + objs:Baz baz = isolated client object { + public isolated function execute() returns anydata|error { + return "baz"; + } + }; + assertTrue(baz is objs:Baz); + + objs:Xyz xyz = isolated service object { + public isolated function execute() returns anydata|error { + return "xyz"; + } + }; + assertTrue(xyz is objs:Xyz); + assertTrue(xyz is objs:Xyz); + + objs:Qux qux = isolated service object { + public isolated function execute() returns anydata|error { + return "qux"; + } + }; + assertTrue(qux is objs:Qux); + assertTrue(quxMod is objs:Qux); + + objs:Quxx quxx = isolated client object { + public isolated function execute() returns anydata|error { + return "quxx"; + } + }; + + objs:Muxx _ = quxx; + Quxx _ = quxx; + assertTrue(quxx is Quxx); + + Quxx _ = isolated client object { + public isolated function execute() returns anydata|error { + return "quxx"; + } + }; + objs:Quxx _ = quxx; + assertTrue(quxx is objs:Quxx); +} + +function assertTrue(anydata actual) { + assertEquality(actual, true); +} + +function assertFalse(anydata actual) { + assertEquality(actual, false); +} + +function assertEquality(anydata actual, anydata expected) { + if expected == actual { + return; + } + + string expectedValAsString = expected.toString(); + string actualValAsString = actual.toString(); + panic error("AssertionError", + message = "expected '" + expectedValAsString + "', found '" + actualValAsString + "'"); +} diff --git a/tests/jballerina-unit-test/src/test/resources/test-src/bala/test_projects/bir_test_project/Ballerina.toml b/tests/jballerina-unit-test/src/test/resources/test-src/bala/test_projects/bir_test_project/Ballerina.toml new file mode 100644 index 000000000000..00aeb4dac6b4 --- /dev/null +++ b/tests/jballerina-unit-test/src/test/resources/test-src/bala/test_projects/bir_test_project/Ballerina.toml @@ -0,0 +1,4 @@ +[package] +org = "bir" +name = "objs" +version = "0.1.0" diff --git a/tests/jballerina-unit-test/src/test/resources/test-src/bala/test_projects/bir_test_project/main.bal b/tests/jballerina-unit-test/src/test/resources/test-src/bala/test_projects/bir_test_project/main.bal new file mode 100644 index 000000000000..eb0f3eedc785 --- /dev/null +++ b/tests/jballerina-unit-test/src/test/resources/test-src/bala/test_projects/bir_test_project/main.bal @@ -0,0 +1,43 @@ +// Copyright (c) 2023 WSO2 LLC. (http://www.wso2.org) All Rights Reserved. +// +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +public type Foo distinct isolated client object { + public isolated function execute() returns anydata|error; +}; + +public type Bar distinct isolated client object { + public isolated function execute() returns anydata|error; +}; + +public type Baz isolated client object { + public isolated function execute() returns anydata|error; +}; + +public type Xyz distinct isolated service object { + public isolated function execute() returns anydata|error; +}; + +public type Qux distinct isolated service object { + public isolated function execute() returns anydata|error; +}; + +public type Quxx isolated client object { + public isolated function execute() returns anydata|error; +}; + +public type Muxx isolated client object { + public isolated function execute() returns anydata|error; +}; diff --git a/tests/jballerina-unit-test/src/test/resources/test-src/bir/bir-dump/$lambda$_0 b/tests/jballerina-unit-test/src/test/resources/test-src/bir/bir-dump/$lambda$_0 index bfcba50a1fda..a78f1154989f 100644 --- a/tests/jballerina-unit-test/src/test/resources/test-src/bir/bir-dump/$lambda$_0 +++ b/tests/jballerina-unit-test/src/test/resources/test-src/bir/bir-dump/$lambda$_0 @@ -9,8 +9,8 @@ $lambda$_0 function(map}>, i %12(TEMP) int; %14(TEMP) string; %16(TEMP) int; - %19(LOCAL) string; - %23(TEMP) string; + %18(LOCAL) string; + %21(TEMP) string; bb0 { %3 = ConstLoad 34; @@ -30,8 +30,8 @@ $lambda$_0 function(map}>, i } bb2 { %14 = ConstLoad l; - %23 = %1[%14]; - %19 = s + %23; + %21 = %1[%14]; + %18 = s + %21; %14 = ConstLoad a; %12 = %1[%14]; %0 = %3 + %12; diff --git a/tests/jballerina-unit-test/src/test/resources/test-src/bir/bir-dump/failLockWithinLock b/tests/jballerina-unit-test/src/test/resources/test-src/bir/bir-dump/failLockWithinLock index b1ddbf4699f7..26b58402ab6c 100644 --- a/tests/jballerina-unit-test/src/test/resources/test-src/bir/bir-dump/failLockWithinLock +++ b/tests/jballerina-unit-test/src/test/resources/test-src/bir/bir-dump/failLockWithinLock @@ -15,6 +15,7 @@ failLockWithinLock function() -> (int, string) { %23(TEMP) map; %24(LOCAL) error; %41(TEMP) int; + %42(TEMP) int; bb0 { lock -> bb1; @@ -102,6 +103,7 @@ failLockWithinLock function() -> (int, string) { bb19 { %19 = newType (int, string); %41 = ConstLoad 2; + %42 = lockWithinLockInt; %0 = newArray %19[%41]; GOTO bb20; } diff --git a/tests/jballerina-unit-test/src/test/resources/test-src/runtime/api/identifier_utils/main.bal b/tests/jballerina-unit-test/src/test/resources/test-src/runtime/api/identifier_utils/main.bal index b75bb42eafa0..8b8fa9362fbf 100644 --- a/tests/jballerina-unit-test/src/test/resources/test-src/runtime/api/identifier_utils/main.bal +++ b/tests/jballerina-unit-test/src/test/resources/test-src/runtime/api/identifier_utils/main.bal @@ -31,6 +31,10 @@ service class AccountService { email: "john.doe@email.com", phone: "1234567890" }; + resource function get packages(int? 'limit = ()) returns json => { + 'limit: 'limit, + body: "hello" + }; } public function main() { @@ -43,6 +47,8 @@ public function main() { function testFunctionParameters() { test:assertEquals(getParameterName(function(string account\-id) {}), "account-id"); test:assertEquals(getParameterNameFromResource(AccountService), "account-id"); + test:assertEquals(getParameterDefaultFunctionNameFromResource(AccountService), + "$AccountService_$get$packages_limit"); } function testIdentifierDecoding() { @@ -91,3 +97,7 @@ function getParameterName(function f) returns string = @java:Method { function getParameterNameFromResource(typedesc serviceObj) returns string = @java:Method { 'class: "org.ballerinalang.nativeimpl.jvm.runtime.api.tests.Values" } external; + +function getParameterDefaultFunctionNameFromResource(typedesc serviceObj) returns string = @java:Method { + 'class: "org.ballerinalang.nativeimpl.jvm.runtime.api.tests.Values" +} external; diff --git a/tests/jballerina-unit-test/src/test/resources/test-src/statements/arrays/array-initializer-expr.bal b/tests/jballerina-unit-test/src/test/resources/test-src/statements/arrays/array-initializer-expr.bal index 6de7ccda129c..358c94950e63 100644 --- a/tests/jballerina-unit-test/src/test/resources/test-src/statements/arrays/array-initializer-expr.bal +++ b/tests/jballerina-unit-test/src/test/resources/test-src/statements/arrays/array-initializer-expr.bal @@ -1,3 +1,60 @@ +// Copyright (c) 2019, WSO2 LLC. (https://www.wso2.com) All Rights Reserved. +// +// WSO2 LLC. licenses this file to you under the Apache License, +// Version 2.0 (the "License"); you may not use this file except +// in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +import ballerina/test; + +int num = 0; +string str = "a"; + +class ArrayTest { + + int num = 0; + + function getNum() returns int { + self.num += 1; + return 2; + } + + function testArrayInitWithSelfVars() { + int[] arr = [0, 1, self.num, self.getNum(), self.num, num, getNum(), num]; + test:assertEquals(arr, [0, 1, 0, 2, 1, 1, 2, 2], "Array values are not equal"); + } +} + +function testArrayInitWithGlobalVars() { + int[] arr = [1, num, 3, getNum(), num]; + test:assertEquals(arr, [1, 0, 3, 1, 1], "Array values are not equal"); + + string[] arr2 = ["q", str, "w", getStr(), "e", str]; + test:assertEquals(arr2, ["q", "ab", "w", "ab", "e", "ab"], "Array values are not equal"); + + ArrayTest arrayTest = new ArrayTest(); + arrayTest.testArrayInitWithSelfVars(); +} + +function getNum() returns int { + num = num + 1; + return num; +} + +function getStr() returns string { + str = str + "b"; + return str; +} + function arrayInitTest() returns (int) { int[] arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]; int size = 11; diff --git a/tests/jballerina-unit-test/src/test/resources/test-src/types/constant/constant-assignment-negative.bal b/tests/jballerina-unit-test/src/test/resources/test-src/types/constant/constant-assignment-negative.bal index 23d7fbadf95c..64dfac4d73a6 100644 --- a/tests/jballerina-unit-test/src/test/resources/test-src/types/constant/constant-assignment-negative.bal +++ b/tests/jballerina-unit-test/src/test/resources/test-src/types/constant/constant-assignment-negative.bal @@ -24,3 +24,9 @@ const Foo F1 = {x: {b : "a"}, i: 1, c: 2}; const record{|X x; int i;|} F2 = {x: {b : "a"}, i: 1, c: 2}; const X F3 = {b : "b"}; + +const string[] Y = base16 `aabb`; + +const [string, int] Z = base16 `aabb`; + +const [170] Z1 = base16 `aabb`; diff --git a/tests/jballerina-unit-test/src/test/resources/test-src/types/constant/constant-type.bal b/tests/jballerina-unit-test/src/test/resources/test-src/types/constant/constant-type.bal index 006a67d51355..3f4faf6e34ff 100644 --- a/tests/jballerina-unit-test/src/test/resources/test-src/types/constant/constant-type.bal +++ b/tests/jballerina-unit-test/src/test/resources/test-src/types/constant/constant-type.bal @@ -318,6 +318,58 @@ function testResolvingConstValForConstantsOfUserDefinedTypes() { assertEqual(q, -60); } +const byte[] data1 = base16 `55 EE 66`; +const byte[] data2 = base64 `ABCD pqrs`; + +const byte[3] data3 = base16 `55 EE 66`; +const byte[6] data4 = base64 `ABCD pqrs`; + +const data5 = base16 `55 EE 66`; +const data6 = base64 `ABCD pqrs`; + +const byte[*] data7 = base16 `55 EE 66`; +const byte[*] data8 = base64 `ABCD pqrs`; + +const [170] data9 = base16 `aa`; +const [170, 187] data10 = base16 `aabb`; + +function testConstByteArrLiteral() { + assertEqual(data1.length(), 3); + assertEqual(data2.length(), 6); + assertEqual(data1[0], 0x55); + assertEqual(data1[1], 0xEE); + assertEqual(data1[2], 0x66); + assertEqual(data2[0], 0); + assertEqual(data2[1], 16); + assertEqual(data2[2], 131); + assertEqual(data2[3], 166); + assertEqual(data2[4], 170); + assertEqual(data2[5], 236); + + assertEqual(data3.length(), 3); + assertEqual(data4.length(), 6); + assertEqual(data3[1], 0xEE); + assertEqual(data4[2], 131); + + assertEqual(data5.length(), 3); + assertEqual(data6.length(), 6); + assertEqual(data5[1], 0xEE); + assertEqual(data6[2], 131); + + assertEqual(data5.length(), 3); + assertEqual(data6.length(), 6); + assertEqual(data5[1], 0xEE); + assertEqual(data6[2], 131); + + assertEqual(data7.length(), 3); + assertEqual(data8.length(), 6); + assertEqual(data7[1], 0xEE); + assertEqual(data8[2], 131); + + assertEqual(data9[0], 170); + assertEqual(data10[1], 187); +} + function assertInvalidUpdateError(error? res, string expectedDetailMessage) { assertTrue(res is error); error err = res; diff --git a/tests/jballerina-unit-test/src/test/resources/test-src/types/table/table_value_assign_test.bal b/tests/jballerina-unit-test/src/test/resources/test-src/types/table/table_value_assign_test.bal index 1dc583552846..c89a386d877e 100644 --- a/tests/jballerina-unit-test/src/test/resources/test-src/types/table/table_value_assign_test.bal +++ b/tests/jballerina-unit-test/src/test/resources/test-src/types/table/table_value_assign_test.bal @@ -32,7 +32,10 @@ function testAssignKeyedTableValueToAnydata() { assertEqual(a1, a2); assertEqual(tbl1, a2); - assertEqual(isEqual(table key(name) [{name: "Amy", id: 1234}, {name: "John", id: 4567}], a2), true); + assertEqual(isEqual(table key(name) [ + {name: "Amy", id: 1234}, + {name: "John", id: 4567} + ], a2), true); } function isEqual(anydata tabl1, anydata table2) returns boolean { @@ -53,7 +56,10 @@ function testAssignKeyedTableValueToAny() { assertEqual(a1, a2); assertEqual(tbl1, a2); - var tbl2 = table key(name) [{name: "Amy", id: 1234}, {name: "John", id: 4567}]; + var tbl2 = table key(name) [ + {name: "Amy", id: 1234}, + {name: "John", id: 4567} + ]; assertEqual(tbl2, a2); } @@ -68,10 +74,14 @@ function testAssignKeyedTableValueToVar() { {name: "John", id: 4567} ]; - var ids = from var {id} in tbl1 select {id}; - table a3 = ids; + var ids = from var {id} in tbl1 + select {id}; + table a3 = ids; - var a4 = table [{"id": 1234}, {"id": 4567}]; + var a4 = table [ + {"id": 1234}, + {"id": 4567} + ]; assertEqual(a1, a2); assertEqual(tbl1, a2); @@ -84,10 +94,17 @@ function testAssignKeyedTableValueToTableType() { {name: "Amy", id: 1234}, {name: "John", id: 4567} ]; - var a2 = checkpanic table key(id) from var {id} in tbl1 select {id}; - table key(id) a3 = a2; - var a4 = table key(id) [{"id": 1234}, {"id": 4567}]; - var tbl = table key(id) [{"id": 1234}, {"id": 4567}]; + var a2 = checkpanic table key(id) from var {id} in tbl1 + select {id}; + table key(id) a3 = a2; + var a4 = table key(id) [ + {"id": 1234}, + {"id": 4567} + ]; + var tbl = table key(id) [ + {"id": 1234}, + {"id": 4567} + ]; assertEqual(tbl, a3); assertEqual(a3, a4); } @@ -105,7 +122,10 @@ function testAssignKeylessTableValueToAnydata() { assertEqual(a1, a2); assertEqual(tbl1, a2); - assertEqual(isEqual(table [{name: "Amy", id: 1234}, {name: "John", id: 4567}], a2), true); + assertEqual(isEqual(table [ + {name: "Amy", id: 1234}, + {name: "John", id: 4567} + ], a2), true); } function testAssignKeylessTableValueToAny() { @@ -119,7 +139,10 @@ function testAssignKeylessTableValueToAny() { {name: "John", id: 4567} ]; - var a3 = table [{name: "Amy", id: 1234}, {name: "John", id: 4567}]; + var a3 = table [ + {name: "Amy", id: 1234}, + {name: "John", id: 4567} + ]; assertEqual(a1, a2); assertEqual(tbl1, a2); @@ -136,8 +159,12 @@ function testAssignKeylessTableValueToVar() { {name: "Amy", id: 1234}, {name: "John", id: 4567} ]; - var ids = from var {id} in tbl1 select {id}; - var a3 = table [{"id": 1234}, {"id": 4567}]; + var ids = from var {id} in tbl1 + select {id}; + var a3 = table [ + {"id": 1234}, + {"id": 4567} + ]; assertEqual(a1, a2); assertEqual(tbl1, a2); assertEqual(tbl1, a2); @@ -149,31 +176,38 @@ function testAssignKeylessTableValueToTableType() { {name: "Amy", id: 1234}, {name: "John", id: 4567} ]; - var a2 = table key() from var {id} in tbl1 select {id}; - table a3 = a2; - var a4 = table [{"id": 1234}, {"id": 4567}]; + var a2 = table key() from var {id} in tbl1 + select {id}; + table a3 = a2; + var a4 = table [ + {"id": 1234}, + {"id": 4567} + ]; assertEqual(a3, a4); } -function testTableVlueAssignmentToAny() { - any tbl = table[]; - table> a1 = >> tbl; +function testTableValueAssignmentToAny() { + any tbl = table []; + table> a1 = >>tbl; a1.add({"any": "any"}); a1.add({"error": error("")}); any t2 = table [{a: 1}]; - table> t3 = >> t2; + table> t3 = >>t2; map m = {a: error("")}; t3.add(m); typedesc td1 = typeof a1; typedesc td2 = typeof t3; - testTableConstructorPassedAsArg(table[]); - testTableConstructorPassedAsArg(table[{a: "4"}, {g: error("")}]); + testTableConstructorPassedAsArg(table []); + testTableConstructorPassedAsArg(table [ + {a: "4"}, + {g: error("")} + ]); - assertEqual("typedesc table>", td1.toString()); - assertEqual("typedesc table>", td2.toString()); + assertEqual("typedesc table>", td1.toString()); + assertEqual("typedesc table>", td2.toString()); } function testTableConstructorPassedAsArg(any tbl) { @@ -183,6 +217,21 @@ function testTableConstructorPassedAsArg(any tbl) { panic error("Type is not table"); } +function testTableValueReturnFromFunction() { + table key(name) & readonly tab1 = getStudentTable(); + table key(name) tab2 = getStudentTable(); + _ = getStudentTable(); + + assertEqual(tab1.length(), 0); + assertEqual(tab2.length(), 0); + assertEqual(getStudentTable().length(), 0); +} + +function getStudentTable() returns readonly & table key(name) { + table key(name) & readonly studentTable = table []; + return studentTable; +} + function assertEqual(any expected, any actual) { if expected is anydata && actual is anydata && expected == actual { return;