diff --git a/ballerina-shell/modules/shell-cli/src/main/java/io/ballerina/shell/cli/jline/validator/ExpressionValidator.java b/ballerina-shell/modules/shell-cli/src/main/java/io/ballerina/shell/cli/jline/validator/ExpressionValidator.java index 0de762496f18..9fc5345ec73c 100644 --- a/ballerina-shell/modules/shell-cli/src/main/java/io/ballerina/shell/cli/jline/validator/ExpressionValidator.java +++ b/ballerina-shell/modules/shell-cli/src/main/java/io/ballerina/shell/cli/jline/validator/ExpressionValidator.java @@ -47,6 +47,6 @@ public boolean evaluate(String source) { IncompleteInputFinder incompleteInputFinder = new IncompleteInputFinder(); Node parsedNode = NodeParser.parseExpression(source); return !parsedNode.hasDiagnostics() || !parsedNode.apply(incompleteInputFinder) - || nextInValidator.evaluate(source); + || (nextInValidator != null && nextInValidator.evaluate(source)); } } diff --git a/ballerina-shell/modules/shell-cli/src/main/java/io/ballerina/shell/cli/jline/validator/ModuleMemberValidator.java b/ballerina-shell/modules/shell-cli/src/main/java/io/ballerina/shell/cli/jline/validator/ModuleMemberValidator.java index f10ba28dde35..af4c290af8e9 100644 --- a/ballerina-shell/modules/shell-cli/src/main/java/io/ballerina/shell/cli/jline/validator/ModuleMemberValidator.java +++ b/ballerina-shell/modules/shell-cli/src/main/java/io/ballerina/shell/cli/jline/validator/ModuleMemberValidator.java @@ -61,11 +61,11 @@ public boolean evaluate(String source) { // Sample testcase : if (x == y) { x = x + 1; x = x + 1; if (lastNode.kind() == SyntaxKind.FUNCTION_DEFINITION) { return !lastNode.hasDiagnostics() || !lastNode.apply(incompleteInputFinder) - || nextInValidator.evaluate(lastNode.toSourceCode()); + || (nextInValidator != null && nextInValidator.evaluate(lastNode.toSourceCode())); } } return !node.imports().isEmpty() || !parsedNode.hasDiagnostics() || !parsedNode.apply(incompleteInputFinder) - || nextInValidator.evaluate(source); + || (nextInValidator != null && nextInValidator.evaluate(source)); } } diff --git a/ballerina-shell/modules/shell-cli/src/main/java/io/ballerina/shell/cli/jline/validator/StatementValidator.java b/ballerina-shell/modules/shell-cli/src/main/java/io/ballerina/shell/cli/jline/validator/StatementValidator.java index f0a223d1b03e..bb6bcddcc377 100644 --- a/ballerina-shell/modules/shell-cli/src/main/java/io/ballerina/shell/cli/jline/validator/StatementValidator.java +++ b/ballerina-shell/modules/shell-cli/src/main/java/io/ballerina/shell/cli/jline/validator/StatementValidator.java @@ -47,6 +47,6 @@ public boolean evaluate(String source) { IncompleteInputFinder incompleteInputFinder = new IncompleteInputFinder(); Node parsedNode = NodeParser.parseBlockStatement("{" + source + "}"); return !parsedNode.hasDiagnostics() || !parsedNode.apply(incompleteInputFinder) - || nextInValidator.evaluate(source); + || (nextInValidator != null && nextInValidator.evaluate(source)); } } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/scheduling/AsyncUtils.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/scheduling/AsyncUtils.java index b7bca9188ae2..d515c77cb385 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/scheduling/AsyncUtils.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/scheduling/AsyncUtils.java @@ -131,7 +131,8 @@ public void notifyFailure(BError error) { * @param returnValueSupplier Suppler used to set the final return value for the parent function invocation. * @param scheduler The scheduler for invoking functions */ - public static void invokeFunctionPointerAsyncIteratively(BFunctionPointer func, @Nullable String strandName, + public static void invokeFunctionPointerAsyncIteratively(BFunctionPointer func, + @Nullable String strandName, StrandMetadata metadata, int noOfIterations, Supplier argsSupplier, Consumer futureResultConsumer, diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/scheduling/Scheduler.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/scheduling/Scheduler.java index 873376a8957c..1d9b53c1427d 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/scheduling/Scheduler.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/scheduling/Scheduler.java @@ -228,8 +228,8 @@ public FutureValue schedule( * @param metadata meta data of new strand * @return Reference to the scheduled task */ - public FutureValue schedule(Object[] params, Function function, @Nullable Strand parent, Callback callback, - String strandName, @Nullable StrandMetadata metadata) { + public FutureValue schedule(Object[] params, Function function, @Nullable Strand parent, + Callback callback, String strandName, @Nullable StrandMetadata metadata) { FutureValue future = createFuture(parent, callback, null, PredefinedTypes.TYPE_NULL, strandName, metadata); return schedule(params, function, future); } diff --git a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/types/BFunctionType.java b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/types/BFunctionType.java index e47fb78d085f..310c3ef9b650 100644 --- a/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/types/BFunctionType.java +++ b/bvm/ballerina-runtime/src/main/java/io/ballerina/runtime/internal/types/BFunctionType.java @@ -40,7 +40,6 @@ public class BFunctionType extends BAnnotatableType implements FunctionType { @Nullable public Type retType; public long flags; - @Nullable public Parameter[] parameters; public BFunctionType(Module pkg) { @@ -52,7 +51,7 @@ public BFunctionType(Module pkg) { public BFunctionType(Module pkg, long flags) { super("function", pkg, Object.class); - this.parameters = null; + this.parameters = new Parameter[0]; this.retType = null; this.flags = flags; } diff --git a/cli/ballerina-cli/src/main/java/io/ballerina/cli/cmd/CommandUtil.java b/cli/ballerina-cli/src/main/java/io/ballerina/cli/cmd/CommandUtil.java index 0c8ab7c73fe7..8d0f448bde6e 100644 --- a/cli/ballerina-cli/src/main/java/io/ballerina/cli/cmd/CommandUtil.java +++ b/cli/ballerina-cli/src/main/java/io/ballerina/cli/cmd/CommandUtil.java @@ -998,7 +998,6 @@ private static void initToolPackage(Path path, String packageName) throws IOExce Files.writeString(balToolToml, balToolManifest); } - @Nullable private static Optional findLatest(List packageVersions) { if (packageVersions.isEmpty()) { return Optional.empty(); diff --git a/compiler/ballerina-lang/src/main/java/io/ballerina/compiler/api/impl/ExpectedTypeFinder.java b/compiler/ballerina-lang/src/main/java/io/ballerina/compiler/api/impl/ExpectedTypeFinder.java index 7c49201c0e7b..933761c7c14a 100644 --- a/compiler/ballerina-lang/src/main/java/io/ballerina/compiler/api/impl/ExpectedTypeFinder.java +++ b/compiler/ballerina-lang/src/main/java/io/ballerina/compiler/api/impl/ExpectedTypeFinder.java @@ -1189,7 +1189,7 @@ private Optional getExpectedTypeFromFunction(BLangNode bLangNode, To } if (langLibInvocation) { - if (bLangInvocation.expr.getBType().getKind() == TypeKind.ARRAY) { + if (bLangInvocation.expr != null && bLangInvocation.expr.getBType().getKind() == TypeKind.ARRAY) { return Optional.ofNullable(typesFactory.getTypeDescriptor (((BArrayType) bLangInvocation.expr.expectedType).eType)); } diff --git a/compiler/ballerina-lang/src/main/java/org/ballerinalang/spi/SystemPackageRepositoryProvider.java b/compiler/ballerina-lang/src/main/java/org/ballerinalang/spi/SystemPackageRepositoryProvider.java index b66d067fc7af..50b305a8c65a 100644 --- a/compiler/ballerina-lang/src/main/java/org/ballerinalang/spi/SystemPackageRepositoryProvider.java +++ b/compiler/ballerina-lang/src/main/java/org/ballerinalang/spi/SystemPackageRepositoryProvider.java @@ -18,7 +18,6 @@ package org.ballerinalang.spi; import org.ballerinalang.repository.PackageRepository; -import org.jetbrains.annotations.Nullable; import org.wso2.ballerinalang.compiler.packaging.repo.Repo; import java.net.URI; @@ -32,12 +31,11 @@ */ public interface SystemPackageRepositoryProvider { - @Nullable static URI getClassUri(Object obj) { try { return obj.getClass().getProtectionDomain().getCodeSource().getLocation().toURI(); - } catch (URISyntaxException ignore) { - return null; + } catch (URISyntaxException e) { + throw new RuntimeException("Error while getting the URI of the class", e); } } diff --git a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/model/symbols/BInvokableSymbol.java b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/model/symbols/BInvokableSymbol.java index 9c8444547cf0..08c6f9382287 100644 --- a/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/model/symbols/BInvokableSymbol.java +++ b/compiler/ballerina-lang/src/main/java/org/wso2/ballerinalang/compiler/semantics/model/symbols/BInvokableSymbol.java @@ -40,7 +40,6 @@ */ public class BInvokableSymbol extends BVarSymbol implements InvokableSymbol { - @Nullable public List params; @Nullable public BVarSymbol restParam; diff --git a/compiler/ballerina-lang/src/test/java/org/ballerinalang/toml/ManifestProcessorTest.java b/compiler/ballerina-lang/src/test/java/org/ballerinalang/toml/ManifestProcessorTest.java index 6b3dca5a9ba6..b024436c5496 100644 --- a/compiler/ballerina-lang/src/test/java/org/ballerinalang/toml/ManifestProcessorTest.java +++ b/compiler/ballerina-lang/src/test/java/org/ballerinalang/toml/ManifestProcessorTest.java @@ -167,7 +167,7 @@ public void testDependenciesIrregularPath() throws TomlException, IOException { Manifest manifest = ManifestProcessor.parseTomlContentFromString(this.validProjectBlock + "[dependencies] \n " + "string-utils = {path = '" + balaPath + "', version = \"1.1.5\"} \n"); - Path manifestPath = manifest.getDependencies().get(0).getMetadata().getPath(); + Path manifestPath = manifest.getDependencies().get(0).getMetadata().getPath().orElseThrow(); if (manifestPath.toString().contains("\\")) { manifestPath = Path.of(manifestPath.toString().replace("\\", "/")); } else { diff --git a/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/AbstractParserErrorHandler.java b/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/AbstractParserErrorHandler.java index 2d85c3bca683..6d321474e876 100644 --- a/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/AbstractParserErrorHandler.java +++ b/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/AbstractParserErrorHandler.java @@ -25,6 +25,7 @@ import java.util.ArrayDeque; import java.util.ArrayList; import java.util.List; +import java.util.Objects; /** * Class to be extended by any parser error handler class. @@ -159,7 +160,7 @@ private void validateSolution(Result bestMatch, ParserRuleContext currentCtx, ST } Solution firstFix = bestMatch.popFix(); - Solution secondFix = bestMatch.peekFix(); + Solution secondFix = bestMatch.peekFix().orElseThrow(); bestMatch.pushFix(firstFix); if (secondFix.action == Action.REMOVE && secondFix.depth == 1) { @@ -314,9 +315,8 @@ public void switchContext(ParserRuleContext context) { * * @return head of the stack */ - @Nullable protected ParserRuleContext getParentContext() { - return this.ctxStack.peek(); + return Objects.requireNonNull(this.ctxStack.peek()); } /** @@ -324,12 +324,11 @@ protected ParserRuleContext getParentContext() { * * @return second element of the stack */ - @Nullable protected ParserRuleContext getGrandParentContext() { ParserRuleContext parent = this.ctxStack.pop(); ParserRuleContext grandParent = this.ctxStack.peek(); this.ctxStack.push(parent); - return grandParent; + return Objects.requireNonNull(grandParent); } /** @@ -422,8 +421,8 @@ protected Result seekInAlternativesPaths(int lookahead, int currentDepth, int cu } if (currentMatchRemoveFixes == bestMatchRemoveFixes) { - Solution currentSol = bestMatch.peekFix(); - Solution foundSol = currentMatch.peekFix(); + Solution currentSol = bestMatch.peekFix().orElseThrow(); + Solution foundSol = currentMatch.peekFix().orElseThrow(); if (currentSol.action == Action.REMOVE && foundSol.action == Action.INSERT) { bestMatch = currentMatch; } @@ -480,7 +479,7 @@ protected Result fixAndContinue(ParserRuleContext currentCtx, int lookahead, int // i.e: do not increment the match count by 1; if (isEntryPoint) { - fixedPathResult.solution = fixedPathResult.peekFix(); + fixedPathResult.solution = fixedPathResult.peekFix().orElseThrow(); } else { fixedPathResult.solution = new Solution(Action.KEEP, currentCtx, getExpectedTokenKind(currentCtx), currentCtx.toString()); diff --git a/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/BallerinaLexer.java b/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/BallerinaLexer.java index a00d39fee324..f0ccf57b7b01 100644 --- a/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/BallerinaLexer.java +++ b/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/BallerinaLexer.java @@ -26,6 +26,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Objects; /** * A LL(k) lexer for ballerina. @@ -45,7 +46,7 @@ public BallerinaLexer(CharReader charReader) { */ @Override public STToken nextToken() { - STToken token = switch (this.mode) { + STToken token = switch (Objects.requireNonNull(this.mode, "Lexer mode was null, an underflow occurred")) { case TEMPLATE -> readTemplateToken(); case REGEXP -> readRegExpTemplateToken(); case INTERPOLATION -> { 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 4eca61a20be0..20260b312f4e 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 @@ -72,6 +72,7 @@ import io.ballerina.compiler.syntax.tree.SyntaxKind; import io.ballerina.tools.diagnostics.DiagnosticCode; import io.ballerina.tools.text.CharReader; +import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Nullable; import java.util.ArrayDeque; @@ -19016,12 +19017,12 @@ private List getBindingPatternsList(List ambibuousList, boolean return bindingPatterns; } - @Nullable + @Contract("null, _ -> null; !null, _ -> !null") private STNode getBindingPattern(STNode ambiguousNode, boolean isListBP) { DiagnosticCode errorCode = DiagnosticErrorCode.ERROR_INVALID_BINDING_PATTERN; if (isEmpty(ambiguousNode)) { - return ambiguousNode; + return null; } switch (ambiguousNode.kind) { diff --git a/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/BallerinaParserErrorHandler.java b/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/BallerinaParserErrorHandler.java index 338bba8c447b..9394b52682d6 100644 --- a/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/BallerinaParserErrorHandler.java +++ b/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/BallerinaParserErrorHandler.java @@ -854,7 +854,7 @@ public class BallerinaParserErrorHandler extends AbstractParserErrorHandler { private static final ParserRuleContext[] OPTIONAL_TOP_LEVEL_SEMICOLON = { ParserRuleContext.TOP_LEVEL_NODE, ParserRuleContext.SEMICOLON }; - private static final ParserRuleContext[] TUPLE_MEMBER = + private static final ParserRuleContext[] TUPLE_MEMBER = { ParserRuleContext.ANNOTATIONS, ParserRuleContext.TYPE_DESC_IN_TUPLE }; public BallerinaParserErrorHandler(@Nullable AbstractTokenReader tokenReader) { diff --git a/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/DocumentationLexer.java b/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/DocumentationLexer.java index 739330972b23..609cade04e09 100644 --- a/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/DocumentationLexer.java +++ b/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/DocumentationLexer.java @@ -28,6 +28,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Objects; /** * A LL(k) lexer for documentation in ballerina. @@ -63,7 +64,7 @@ public DocumentationLexer(CharReader charReader, */ @Override public STToken nextToken() { - STToken token = switch (this.mode) { + STToken token = switch (Objects.requireNonNull(this.mode, "Lexer mode was null, an underflow occurred")) { case DOC_LINE_START_HASH -> { processLeadingTrivia(); yield readDocLineStartHashToken(); diff --git a/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/RegExpLexer.java b/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/RegExpLexer.java index b51cc5b3f5ab..e512f3c6866b 100644 --- a/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/RegExpLexer.java +++ b/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/RegExpLexer.java @@ -25,6 +25,7 @@ import io.ballerina.tools.text.CharReader; import java.util.ArrayList; +import java.util.Objects; /** * A LL(k) lexer for RegExp in ballerina. @@ -45,7 +46,7 @@ public RegExpLexer(CharReader charReader) { @Override public STToken nextToken() { STToken token; - switch (this.mode) { + switch (Objects.requireNonNull(this.mode, "Lexer mode was null, an underflow occurred")) { case RE_DISJUNCTION: case RE_CHAR_CLASS: token = readTokenInReDisjunction(); diff --git a/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/Result.java b/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/Result.java index 8d8c155019fd..6c4d045ec395 100644 --- a/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/Result.java +++ b/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/Result.java @@ -17,9 +17,8 @@ */ package io.ballerina.compiler.internal.parser; -import org.jetbrains.annotations.Nullable; - import java.util.ArrayDeque; +import java.util.Optional; /** * Represent a result of a token-sequence-search in a sub-tree. The result will contain the fixes required to @@ -58,9 +57,8 @@ public Result(ArrayDeque fixes, int matches this.matches = matches; } - @Nullable - protected AbstractParserErrorHandler.Solution peekFix() { - return this.fixes.peek(); + protected Optional peekFix() { + return Optional.ofNullable(this.fixes.peek()); } protected AbstractParserErrorHandler.Solution popFix() { diff --git a/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/XMLLexer.java b/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/XMLLexer.java index cce1fffacf19..728dd5215b10 100644 --- a/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/XMLLexer.java +++ b/compiler/ballerina-parser/src/main/java/io/ballerina/compiler/internal/parser/XMLLexer.java @@ -26,6 +26,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Objects; /** * A LL(k) lexer for XML in ballerina. @@ -45,7 +46,7 @@ public XMLLexer(CharReader charReader) { */ @Override public STToken nextToken() { - STToken token = switch (this.mode) { + STToken token = switch (Objects.requireNonNull(this.mode, "Lexer mode was null, an underflow occurred")) { case XML_CONTENT -> readTokenInXMLContent(); case XML_ELEMENT_START_TAG -> { processLeadingXMLTrivia(); diff --git a/compiler/ballerina-tools-api/src/main/java/io/ballerina/tools/text/LineMap.java b/compiler/ballerina-tools-api/src/main/java/io/ballerina/tools/text/LineMap.java index ceb269a16462..63bb3d1ed8b2 100644 --- a/compiler/ballerina-tools-api/src/main/java/io/ballerina/tools/text/LineMap.java +++ b/compiler/ballerina-tools-api/src/main/java/io/ballerina/tools/text/LineMap.java @@ -45,6 +45,9 @@ TextLine textLine(int line) { LinePosition linePositionFrom(int position) { positionRangeCheck(position); TextLine textLine = findLineFrom(position); + if (textLine == null) { + throw new IllegalArgumentException("Cannot find a line with the character offset '" + position + "'"); + } return LinePosition.from(textLine.lineNo(), position - textLine.startOffset()); } @@ -98,7 +101,6 @@ private TextLine findLineFrom(int position) { return textLines[length - 1]; } - TextLine foundTextLine = null; int left = 0; int right = length - 1; while (left <= right) { @@ -109,14 +111,13 @@ private TextLine findLineFrom(int position) { int startOffset = textLines[middle].startOffset(); int endOffset = textLines[middle].endOffsetWithNewLines(); if (startOffset <= position && position < endOffset) { - foundTextLine = textLines[middle]; - break; + return textLines[middle]; } else if (endOffset <= position) { left = middle + 1; } else { right = middle - 1; } } - return foundTextLine; + return null; } } diff --git a/language-server/modules/langserver-commons/src/main/java/org/ballerinalang/langserver/commons/toml/common/completion/TomlCompletionUtil.java b/language-server/modules/langserver-commons/src/main/java/org/ballerinalang/langserver/commons/toml/common/completion/TomlCompletionUtil.java index 9ee4fd2e6a37..d19b8795105e 100644 --- a/language-server/modules/langserver-commons/src/main/java/org/ballerinalang/langserver/commons/toml/common/completion/TomlCompletionUtil.java +++ b/language-server/modules/langserver-commons/src/main/java/org/ballerinalang/langserver/commons/toml/common/completion/TomlCompletionUtil.java @@ -71,7 +71,8 @@ public static void fillNodeAtCursor(TomlCompletionContext context) { context.setCursorPositionInTree(txtPos); TextRange range = TextRange.from(txtPos, 0); NonTerminalNode nonTerminalNode = ((DocumentNode) st.get().rootNode()).findNode(range); - while (nonTerminalNode.parent() != null && !TomlSyntaxTreeUtil.withinTextRange(txtPos, nonTerminalNode)) { + while (nonTerminalNode != null && + nonTerminalNode.parent() != null && !TomlSyntaxTreeUtil.withinTextRange(txtPos, nonTerminalNode)) { //Takes the top-level Node of the immediate cursor position nonTerminalNode = nonTerminalNode.parent(); } diff --git a/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/codeaction/providers/ExtractToLocalVarCodeAction.java b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/codeaction/providers/ExtractToLocalVarCodeAction.java index 6054520d2c45..3fc63e9abbb4 100644 --- a/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/codeaction/providers/ExtractToLocalVarCodeAction.java +++ b/language-server/modules/langserver-core/src/main/java/org/ballerinalang/langserver/codeaction/providers/ExtractToLocalVarCodeAction.java @@ -44,7 +44,6 @@ import org.eclipse.lsp4j.Position; import org.eclipse.lsp4j.Range; import org.eclipse.lsp4j.TextEdit; -import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Collections; @@ -226,7 +225,6 @@ public String getName() { return NAME; } - @Nullable private Node getStatementNode(Node node) { Node statementNode = node; while (statementNode != null && !(statementNode instanceof StatementNode) 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 2ab3a8f4babd..16a674e29ee4 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 @@ -202,6 +202,9 @@ public void visit(LetVariableDeclarationNode letVariableDeclarationNode) { @Override public void visit(StartActionNode startActionNode) { startActionNode.parent().accept(this); + if (returnTypeSymbol == null) { + throw new IllegalStateException("Return type symbol cannot be null"); + } if (resultFound && returnTypeSymbol.typeKind() == TypeDescKind.FUTURE) { FutureTypeSymbol futureTypeSymbol = (FutureTypeSymbol) returnTypeSymbol; TypeSymbol typeSymbol = futureTypeSymbol.typeParameter().orElse(null); @@ -268,6 +271,9 @@ public void visit(PositionalArgumentNode positionalArgumentNode) { if (!resultFound) { return; } + if (returnTypeSymbol == null) { + throw new IllegalStateException("Return type symbol cannot be null"); + } // This is the message parameter of an error constructor. if (returnTypeSymbol.typeKind() == TypeDescKind.ERROR) { @@ -326,6 +332,9 @@ public void visit(NamedArgumentNode namedArgumentNode) { if (!resultFound) { return; } + if (returnTypeSymbol == null) { + throw new IllegalStateException("Return type symbol cannot be null"); + } if (returnTypeSymbol.typeKind() == TypeDescKind.ERROR) { ErrorTypeSymbol errorTypeSymbol = (ErrorTypeSymbol) returnTypeSymbol; @@ -364,6 +373,10 @@ public void visit(NamedArgumentNode namedArgumentNode) { */ private Optional> getParameterSymbols() { FunctionTypeSymbol functionTypeSymbol; + if (returnTypeSymbol == null) { + throw new IllegalStateException("Return type symbol cannot be null"); + } + if (returnTypeSymbol.typeKind() == TypeDescKind.FUNCTION) { functionTypeSymbol = (FunctionTypeSymbol) returnTypeSymbol; } else if (returnTypeSymbol.kind() == SymbolKind.CLASS) { @@ -434,6 +447,9 @@ public void visit(ReturnStatementNode returnStatementNode) { resetResult(); return; } + if (returnTypeSymbol == null) { + throw new IllegalStateException("Return type symbol cannot be null"); + } if (returnTypeSymbol.typeKind() == TypeDescKind.FUNCTION) { FunctionTypeSymbol functionTypeSymbol = (FunctionTypeSymbol) returnTypeSymbol; functionTypeSymbol.returnTypeDescriptor().ifPresentOrElse(this::checkAndSetTypeResult, this::resetResult); @@ -512,6 +528,9 @@ public void visit(GroupingKeyVarDeclarationNode groupingKeyVarDeclarationNode) { @Override public void visit(SelectClauseNode selectClauseNode) { selectClauseNode.parent().parent().accept(this); + if (returnTypeSymbol == null) { + throw new IllegalStateException("Return type symbol cannot be null"); + } if (resultFound) { TypeDescKind kind = this.returnTypeSymbol.typeKind(); if (kind == TypeDescKind.ARRAY) { diff --git a/misc/debug-adapter/modules/debug-adapter-core/src/main/java/module-info.java b/misc/debug-adapter/modules/debug-adapter-core/src/main/java/module-info.java index b92017cb6eda..fa607cb80e57 100644 --- a/misc/debug-adapter/modules/debug-adapter-core/src/main/java/module-info.java +++ b/misc/debug-adapter/modules/debug-adapter-core/src/main/java/module-info.java @@ -10,6 +10,7 @@ requires io.ballerina.identifier; requires org.apache.commons.lang3; requires static org.jetbrains.annotations; + requires com.google.errorprone.annotations; exports org.ballerinalang.debugadapter.launcher; } diff --git a/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/ExecutionContext.java b/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/ExecutionContext.java index 4b934714c694..8ea32ee68af1 100644 --- a/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/ExecutionContext.java +++ b/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/ExecutionContext.java @@ -20,7 +20,6 @@ import io.ballerina.projects.Project; import org.ballerinalang.debugadapter.jdi.VirtualMachineProxyImpl; import org.eclipse.lsp4j.debug.services.IDebugProtocolClient; -import org.jetbrains.annotations.Nullable; import java.io.BufferedReader; import java.io.InputStreamReader; @@ -82,26 +81,23 @@ public void setDebuggeeVM(VirtualMachineProxyImpl debuggeeVM) { this.debuggeeVM = debuggeeVM; } - @Nullable public EventRequestManager getEventManager() { if (debuggeeVM == null) { - return null; + throw new IllegalStateException("Debuggee VM is not initialized."); } return debuggeeVM.eventRequestManager(); } - @Nullable public BufferedReader getInputStream() { if (launchedProcess == null) { - return null; + throw new IllegalStateException("Launched process is not initialized."); } return new BufferedReader(new InputStreamReader(launchedProcess.getInputStream(), StandardCharsets.UTF_8)); } - @Nullable public BufferedReader getErrorStream() { if (launchedProcess == null) { - return null; + throw new IllegalStateException("Launched process is not initialized."); } return new BufferedReader(new InputStreamReader(launchedProcess.getErrorStream(), StandardCharsets.UTF_8)); } diff --git a/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/JBallerinaDebugServer.java b/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/JBallerinaDebugServer.java index 03635beb1b0c..3086a1e08d53 100755 --- a/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/JBallerinaDebugServer.java +++ b/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/JBallerinaDebugServer.java @@ -340,7 +340,7 @@ public CompletableFuture pause(PauseArguments args) { public CompletableFuture stackTrace(StackTraceArguments args) { StackTraceResponse stackTraceResponse = new StackTraceResponse(); try { - activeThread = getAllThreads().get(args.getThreadId()); + ThreadReferenceProxyImpl activeThread = getAllThreads().get(args.getThreadId()); if (loadedThreadFrames.containsKey(activeThread.uniqueID())) { stackTraceResponse.setStackFrames(loadedThreadFrames.get(activeThread.uniqueID())); } else { @@ -351,6 +351,7 @@ public CompletableFuture stackTrace(StackTraceArguments args stackTraceResponse.setStackFrames(validFrames); loadedThreadFrames.put(activeThread.uniqueID(), validFrames); } + this.activeThread = activeThread; return CompletableFuture.completedFuture(stackTraceResponse); } catch (Exception e) { LOGGER.error(e.getMessage(), e); @@ -798,7 +799,7 @@ private Variable[] computeGlobalVariables(SuspendedContext context, int stackFra } private Variable[] computeStackFrameVariables(VariablesArguments args) throws Exception { - StackFrameProxyImpl stackFrame = suspendedContext.getFrame(); + StackFrameProxyImpl stackFrame = Objects.requireNonNull(suspendedContext).getFrame(); List variables = new ArrayList<>(); List localVariableProxies = stackFrame.visibleVariables(); for (LocalVariableProxyImpl var : localVariableProxies) { @@ -946,7 +947,7 @@ private Variable[] createVariableArrayFrom(VariablesArguments args, List */ @Nullable Map getAllThreads() { if (context.getDebuggeeVM() == null) { - return null; + throw new IllegalStateException("Debuggee VM is not available"); } Collection threadReferences = context.getDebuggeeVM().getVirtualMachine().allThreads(); Map threadsMap = new HashMap<>(); diff --git a/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/evaluation/EvaluatorBuilder.java b/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/evaluation/EvaluatorBuilder.java index f15db5db6783..fec4fc513127 100644 --- a/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/evaluation/EvaluatorBuilder.java +++ b/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/evaluation/EvaluatorBuilder.java @@ -181,7 +181,7 @@ public Evaluator build(ExpressionNode parsedExpr) throws EvaluationException { unsupportedNodes.forEach(node -> errors.add(String.format("'%s' - %s", node.toString(), node.kind()))); throw createEvaluationException(UNSUPPORTED_EXPRESSION, errors); } - if (result == null) { + if (result == null && builderException != null) { throw builderException; } return result; diff --git a/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/evaluation/engine/InvocationArgProcessor.java b/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/evaluation/engine/InvocationArgProcessor.java index 914b31ae6329..471c5e6c9d71 100644 --- a/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/evaluation/engine/InvocationArgProcessor.java +++ b/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/evaluation/engine/InvocationArgProcessor.java @@ -147,8 +147,7 @@ protected static Value getRestArgArray(SuspendedContext context, Value arrayType return getRestArgArray.invokeSafely(); } - protected static Value getElementType(SuspendedContext context, @Nullable Value arrayType - ) throws EvaluationException { + protected static Value getElementType(SuspendedContext context, Value arrayType) throws EvaluationException { ReferenceType arrayTypeRef = ((ObjectReference) arrayType).referenceType(); List methods = arrayTypeRef.methodsByName(GET_ELEMENT_TYPE_METHOD); if (methods == null || methods.size() != 1) { diff --git a/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/evaluation/validator/SerialExpressionValidator.java b/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/evaluation/validator/SerialExpressionValidator.java index 3d85d891c0b7..08be6de83aff 100644 --- a/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/evaluation/validator/SerialExpressionValidator.java +++ b/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/evaluation/validator/SerialExpressionValidator.java @@ -26,7 +26,6 @@ import org.ballerinalang.debugadapter.evaluation.validator.impl.InvalidInputValidator; import org.ballerinalang.debugadapter.evaluation.validator.impl.StatementValidator; import org.ballerinalang.debugadapter.evaluation.validator.impl.TopLevelDeclarationValidator; -import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; @@ -44,15 +43,15 @@ */ public class SerialExpressionValidator extends Validator { - @Nullable - private ExpressionValidator expressionValidator; - @Nullable - private List otherValidators; + private final ExpressionValidator expressionValidator = new ExpressionValidator(new ExpressionParser()); + private final List otherValidators = new ArrayList<>(); public SerialExpressionValidator() { super(new DebugParser()); - this.expressionValidator = null; - this.otherValidators = null; + // Validation order is important and should be preserved, to reduce the number of parser trials. + otherValidators.add(new InvalidInputValidator(debugParser)); + otherValidators.add(new TopLevelDeclarationValidator(debugParser)); + otherValidators.add(new StatementValidator()); } /** @@ -72,7 +71,6 @@ public ExpressionNode validateAndParse(String source) throws Exception { @Override public void validate(String source) throws Exception { - loadValidators(); try { expressionValidator.validate(source); } catch (DebugParserException | ValidatorException e) { @@ -106,16 +104,4 @@ private void fallBackOnOtherValidators(String source) throws EvaluationException } } } - - /** - * Loads all validator types, which are required to process the user input. - * Note: validation order is important and should be preserved, to reduce the number of parser trials. - */ - private void loadValidators() { - expressionValidator = new ExpressionValidator(new ExpressionParser()); - otherValidators = new ArrayList<>(); - otherValidators.add(new InvalidInputValidator(debugParser)); - otherValidators.add(new TopLevelDeclarationValidator(debugParser)); - otherValidators.add(new StatementValidator()); - } } diff --git a/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/variable/BCompoundVariable.java b/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/variable/BCompoundVariable.java index e43fb97bef0a..75812e8af715 100644 --- a/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/variable/BCompoundVariable.java +++ b/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/variable/BCompoundVariable.java @@ -33,7 +33,7 @@ public abstract class BCompoundVariable implements BVariable { protected final BVariableType type; protected Value jvmValue; @Nullable - protected Variable dapVariable; + protected Variable dapVariable = null; public BCompoundVariable(SuspendedContext context, String varName, BVariableType bVariableType, Value jvmValue) { this.context = context; @@ -41,7 +41,6 @@ public BCompoundVariable(SuspendedContext context, String varName, BVariableType this.name = decodeIdentifier(varName); this.type = bVariableType; this.jvmValue = jvmValue; - this.dapVariable = null; } /** diff --git a/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/variable/IndexedCompoundVariable.java b/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/variable/IndexedCompoundVariable.java index 42a3f0ea7b71..1aece2c5ee4d 100644 --- a/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/variable/IndexedCompoundVariable.java +++ b/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/variable/IndexedCompoundVariable.java @@ -102,11 +102,12 @@ public Value getChildByName(String key) throws DebugVariableException { @Override public Variable getDapVariable() { if (dapVariable == null) { - dapVariable = new Variable(); + Variable dapVariable = new Variable(); dapVariable.setName(this.name); dapVariable.setType(this.type.getString()); dapVariable.setValue(computeValue()); dapVariable.setIndexedVariables(getChildrenCount()); + this.dapVariable = dapVariable; } return dapVariable; } diff --git a/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/variable/NamedCompoundVariable.java b/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/variable/NamedCompoundVariable.java index eb8d74ca1a8b..15434067ee0e 100644 --- a/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/variable/NamedCompoundVariable.java +++ b/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/variable/NamedCompoundVariable.java @@ -73,11 +73,12 @@ public Value getChildByName(String name) throws DebugVariableException { @Override public Variable getDapVariable() { if (dapVariable == null) { - dapVariable = new Variable(); + Variable dapVariable = new Variable(); dapVariable.setName(this.name); dapVariable.setType(this.type.getString()); dapVariable.setValue(computeValue()); dapVariable.setNamedVariables(getChildrenCount()); + this.dapVariable = dapVariable; } return dapVariable; } diff --git a/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/variable/VariableUtils.java b/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/variable/VariableUtils.java index 88ae099a5675..e7240fe1b3a1 100644 --- a/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/variable/VariableUtils.java +++ b/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/variable/VariableUtils.java @@ -24,6 +24,7 @@ import org.ballerinalang.debugadapter.SuspendedContext; import org.ballerinalang.debugadapter.evaluation.EvaluationException; import org.ballerinalang.debugadapter.jdi.LocalVariableProxyImpl; +import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Nullable; import java.util.AbstractMap; @@ -324,7 +325,7 @@ private static boolean isIntersectionType(Value runtimeType) { * @param typeValue JDI value instance. * @return referred type value. */ - @Nullable + @Contract("null -> null") private static Value getReferredTypeFromTypeRefType(Value typeValue) throws DebugVariableException { while (typeValue != null && isTypeReferenceType(typeValue)) { typeValue = getFieldValue(typeValue, FIELD_REFERRED_TYPE).orElse(null); @@ -339,7 +340,7 @@ private static Value getReferredTypeFromTypeRefType(Value typeValue) throws Debu * @param typeValue JDI value instance. * @return effective type value. */ - @Nullable + @Contract("null -> null") private static Value getEffectiveTypeFromIntersectionType(Value typeValue) throws DebugVariableException { while (typeValue != null && isIntersectionType(typeValue)) { typeValue = getFieldValue(typeValue, FIELD_EFFECTIVE_TYPE).orElse(null); diff --git a/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/variable/types/BMap.java b/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/variable/types/BMap.java index dcfff25afbb5..4125c5adeec9 100644 --- a/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/variable/types/BMap.java +++ b/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/variable/types/BMap.java @@ -101,8 +101,11 @@ private Map getEntries(int startIndex, int count) { if (loadedKeys == null) { loadAllKeys(); } - Map entries = new LinkedHashMap<>(); + if (loadedKeys == null) { + return Collections.emptyMap(); + } List keysRange = loadedKeys.getValues(startIndex, count); + Map entries = new LinkedHashMap<>(); for (int i = startIndex; i < startIndex + count; i++) { Value key = keysRange.get(i - startIndex); if (loadedValues[i] == null) { diff --git a/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/variable/types/BRecord.java b/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/variable/types/BRecord.java index b8fd4dfa2c61..6f2ff4381f2a 100644 --- a/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/variable/types/BRecord.java +++ b/misc/debug-adapter/modules/debug-adapter-core/src/main/java/org/ballerinalang/debugadapter/variable/types/BRecord.java @@ -70,6 +70,9 @@ public Map computeChildVariables() { Map childVarMap = new LinkedHashMap<>(); Map recordFields = getRecordFields(); + if (recordFields == null) { + return childVarMap; + } for (Map.Entry mapEntry : recordFields.entrySet()) { childVarMap.put(Utils.encodeNonFunctionIdentifier( @@ -87,6 +90,9 @@ private Map getRecordFields() { try { loadAllKeys(); Map recordFields = new LinkedHashMap<>(); + if (loadedKeys == null) { + return null; + } List keysRange = loadedKeys.getValues(0, loadedKeys.length()); for (int i = 0; i < loadedKeys.length(); i++) { diff --git a/misc/docerina/src/main/java/org/ballerinalang/docgen/Generator.java b/misc/docerina/src/main/java/org/ballerinalang/docgen/Generator.java index baeeb2bf1d10..cb4427a669f5 100644 --- a/misc/docerina/src/main/java/org/ballerinalang/docgen/Generator.java +++ b/misc/docerina/src/main/java/org/ballerinalang/docgen/Generator.java @@ -93,6 +93,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.Optional; import java.util.StringJoiner; import java.util.stream.Stream; @@ -205,9 +206,9 @@ public static void addTypeDefinition(TypeDescriptorNode typeDescriptorNode, Stri case UNION_TYPE_DESC: Type unionType = Type.fromNode(typeDescriptorNode, semanticModel, module); if (unionType.memberTypes.stream().allMatch(type -> - (type.category != null && type.category.equals("errors")) || - (type.category != null && type.category.equals("builtin")) && - type.name.equals("error"))) { + Objects.equals(type.category, "errors") || + Objects.equals(type.category, "builtin") && + Objects.equals(type.name, "error"))) { module.errors.add(new Error(typeName, getDocFromMetadata(metaDataNode), getDescSectionsDocFromMetaDataList(metaDataNode), isDeprecated(metaDataNode), Type.fromNode(typeDescriptorNode, semanticModel, module))); diff --git a/misc/docerina/src/main/java/org/ballerinalang/docgen/generator/model/Type.java b/misc/docerina/src/main/java/org/ballerinalang/docgen/generator/model/Type.java index 209545ab3149..30d28d8f95d7 100644 --- a/misc/docerina/src/main/java/org/ballerinalang/docgen/generator/model/Type.java +++ b/misc/docerina/src/main/java/org/ballerinalang/docgen/generator/model/Type.java @@ -24,6 +24,7 @@ import io.ballerina.compiler.api.symbols.Documentation; import io.ballerina.compiler.api.symbols.IntersectionTypeSymbol; import io.ballerina.compiler.api.symbols.MapTypeSymbol; +import io.ballerina.compiler.api.symbols.ModuleSymbol; import io.ballerina.compiler.api.symbols.ObjectTypeSymbol; import io.ballerina.compiler.api.symbols.ParameterSymbol; import io.ballerina.compiler.api.symbols.Qualifiable; @@ -252,8 +253,7 @@ public static Type fromNode(Node node, SemanticModel semanticModel, Module modul CATEGORY_INLINE_CLOSED_RECORD : CATEGORY_INLINE_RECORD; type.memberTypes = fields; } else if (node instanceof StreamTypeDescriptorNode streamNode) { - StreamTypeParamsNode streamParams = streamNode.streamTypeParamsNode().isPresent() ? - (StreamTypeParamsNode) streamNode.streamTypeParamsNode().get() : null; + StreamTypeParamsNode streamParams = (StreamTypeParamsNode) streamNode.streamTypeParamsNode().orElse(null); type.name = streamNode.streamKeywordToken().text(); type.category = "stream"; if (streamParams != null) { @@ -358,16 +358,15 @@ public static Type fromSemanticSymbol( resolveSymbolMetaData(type, symbol, module); type.isPublic = true; } - type.name = typeReferenceTypeSymbol.getName().isPresent() ? typeReferenceTypeSymbol.getName().get() : null; + type.name = typeReferenceTypeSymbol.getName().orElse(null); } else if (symbol instanceof RecordTypeSymbol recordTypeSymbol) { Type recordType = type; - recordType.name = recordTypeSymbol.getName().isPresent() ? recordTypeSymbol.getName().get() : ""; - recordType.description = documentation.isPresent() && documentation.get().description().isPresent() ? - documentation.get().description().get() : ""; + recordType.name = recordTypeSymbol.getName().orElse(""); + recordType.description = documentation.flatMap(Documentation::description).orElse(""); recordTypeSymbol.fieldDescriptors().forEach((name, field) -> { Type recField = new Type(); recField.name = name; - recField.description = documentation.isPresent() ? documentation.get().parameterMap().get(name) : ""; + recField.description = documentation.map(doc -> doc.parameterMap().get(name)).orElse(""); recField.elementType = fromSemanticSymbol(field.typeDescriptor(), documentation, parentTypeRefSymbol, isTypeInclusion, module); recordType.memberTypes.add(recField); @@ -385,13 +384,12 @@ public static Type fromSemanticSymbol( recordType.category = CATEGORY_INLINE_RECORD; } else if (symbol instanceof ObjectTypeSymbol objectTypeSymbol) { ObjectType objType = new ObjectType(); - objType.name = objectTypeSymbol.getName().isPresent() ? objectTypeSymbol.getName().get() : ""; + objType.name = objectTypeSymbol.getName().orElse(""); objectTypeSymbol.fieldDescriptors().forEach((name, field) -> { if (field.qualifiers().contains(Qualifier.PUBLIC)) { Type objField = new Type(); objField.name = name; - objField.description = documentation.isPresent() ? - documentation.get().parameterMap().get(name) : ""; + objField.description = documentation.map(doc -> doc.parameterMap().get(name)).orElse(""); objField.elementType = fromSemanticSymbol(field.typeDescriptor(), documentation, parentTypeRefSymbol, isTypeInclusion, module); objType.memberTypes.add(objField); @@ -408,9 +406,8 @@ public static Type fromSemanticSymbol( functionType.name = methodName; functionType.accessor = ""; } - functionType.description = methodSymbol.documentation().isPresent() && - methodSymbol.documentation().get().description().isPresent() ? - methodSymbol.documentation().get().description().get() : null; + functionType.description = methodSymbol.documentation() + .flatMap(Documentation::description).orElse(null); functionType.category = "included_function"; functionType.isIsolated = methodSymbol.qualifiers().contains(Qualifier.ISOLATED); FunctionKind functionKind; @@ -427,7 +424,7 @@ public static Type fromSemanticSymbol( methodSymbol.typeDescriptor().params().ifPresent(parameterSymbols -> { parameterSymbols.forEach(parameterSymbol -> { Type paramType = new Type(); - paramType.name = parameterSymbol.getName().isPresent() ? parameterSymbol.getName().get() : ""; + paramType.name = parameterSymbol.getName().orElse(""); paramType.elementType = fromSemanticSymbol(parameterSymbol.typeDescriptor(), methodSymbol.documentation(), parentTypeRefSymbol, isTypeInclusion, module); paramType.isDeprecated = parameterSymbol.annotations().stream() @@ -501,7 +498,7 @@ public static void addIntersectionMemberTypes(Node node, SemanticModel semanticM } public static void resolveSymbolMetaData(Type type, Symbol symbol, Module module) { - ModuleID moduleID = symbol.getModule().isPresent() ? symbol.getModule().get().id() : null; + ModuleID moduleID = symbol.getModule().map(ModuleSymbol::id).orElse(null); if (moduleID != null) { type.moduleName = moduleID.moduleName(); diff --git a/misc/identifier-util/src/main/java/io/ballerina/identifier/Utils.java b/misc/identifier-util/src/main/java/io/ballerina/identifier/Utils.java index b27f1aef41ca..db701c683109 100644 --- a/misc/identifier-util/src/main/java/io/ballerina/identifier/Utils.java +++ b/misc/identifier-util/src/main/java/io/ballerina/identifier/Utils.java @@ -19,6 +19,7 @@ package io.ballerina.identifier; import org.apache.commons.text.StringEscapeUtils; +import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Nullable; import java.util.regex.Matcher; @@ -140,10 +141,10 @@ private static String getFormattedStringForJvmReservedSet(char c) { * @param encodedIdentifier encoded identifier string * @return decoded identifier */ - @Nullable - public static String decodeIdentifier(@Nullable String encodedIdentifier) { + @Contract("null -> null; !null -> !null") + public static String decodeIdentifier(String encodedIdentifier) { if (encodedIdentifier == null) { - return encodedIdentifier; + return null; } StringBuilder sb = new StringBuilder(); int index = 0; diff --git a/misc/testerina/modules/testerina-core/src/main/java/org/ballerinalang/testerina/TesterinaSystemPackageRepositoryProvider.java b/misc/testerina/modules/testerina-core/src/main/java/org/ballerinalang/testerina/TesterinaSystemPackageRepositoryProvider.java index 6ed62012f2d8..5829f91d5bb3 100644 --- a/misc/testerina/modules/testerina-core/src/main/java/org/ballerinalang/testerina/TesterinaSystemPackageRepositoryProvider.java +++ b/misc/testerina/modules/testerina-core/src/main/java/org/ballerinalang/testerina/TesterinaSystemPackageRepositoryProvider.java @@ -23,7 +23,6 @@ import org.wso2.ballerinalang.compiler.packaging.repo.Repo; import java.nio.file.Path; -import java.util.Objects; /** * This represents the standard Ballerina built-in system package repository provider. @@ -35,7 +34,7 @@ public class TesterinaSystemPackageRepositoryProvider implements SystemPackageRe @Override public Repo loadRepository() { - return new JarRepo(Objects.requireNonNull(SystemPackageRepositoryProvider.getClassUri(this))); + return new JarRepo(SystemPackageRepositoryProvider.getClassUri(this)); } } diff --git a/misc/toml-parser/src/main/java/io/ballerina/toml/internal/parser/AbstractLexer.java b/misc/toml-parser/src/main/java/io/ballerina/toml/internal/parser/AbstractLexer.java index 0212003dc5df..0a5cd7ef1524 100644 --- a/misc/toml-parser/src/main/java/io/ballerina/toml/internal/parser/AbstractLexer.java +++ b/misc/toml-parser/src/main/java/io/ballerina/toml/internal/parser/AbstractLexer.java @@ -28,6 +28,7 @@ import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Collection; +import java.util.Deque; import java.util.List; /** @@ -43,7 +44,7 @@ public abstract class AbstractLexer { protected CharReader reader; @Nullable protected ParserMode mode; - protected ArrayDeque modeStack = new ArrayDeque<>(); + protected Deque modeStack = new ArrayDeque<>(); public AbstractLexer(CharReader charReader, ParserMode initialParserMode) { this(charReader, initialParserMode, new ArrayList<>(INITIAL_TRIVIA_CAPACITY), new ArrayList<>()); diff --git a/misc/toml-parser/src/main/java/io/ballerina/toml/internal/parser/TomlLexer.java b/misc/toml-parser/src/main/java/io/ballerina/toml/internal/parser/TomlLexer.java index 4c60c6a76340..a7b0611b00c8 100644 --- a/misc/toml-parser/src/main/java/io/ballerina/toml/internal/parser/TomlLexer.java +++ b/misc/toml-parser/src/main/java/io/ballerina/toml/internal/parser/TomlLexer.java @@ -28,6 +28,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Objects; /** * A LL(k) lexer for TOML. @@ -48,7 +49,7 @@ public TomlLexer(CharReader charReader) { @Override public STToken nextToken() { STToken token; - switch (this.mode) { + switch (Objects.requireNonNull(this.mode, "Lexer mode was null, an underflow occurred")) { case STRING: token = readStringToken(); break; diff --git a/project-api/test-artifacts/bad-sad-compiler-plugin/src/main/java/io/samjs/plugins/badsad/BadSadCompilerPlugin20.java b/project-api/test-artifacts/bad-sad-compiler-plugin/src/main/java/io/samjs/plugins/badsad/BadSadCompilerPlugin20.java index 0ba605ea30cb..f2f816687755 100644 --- a/project-api/test-artifacts/bad-sad-compiler-plugin/src/main/java/io/samjs/plugins/badsad/BadSadCompilerPlugin20.java +++ b/project-api/test-artifacts/bad-sad-compiler-plugin/src/main/java/io/samjs/plugins/badsad/BadSadCompilerPlugin20.java @@ -19,7 +19,6 @@ import io.ballerina.projects.plugins.CompilerPlugin; import io.ballerina.projects.plugins.CompilerPluginContext; -import org.jetbrains.annotations.Nullable; import java.io.PrintStream; @@ -36,7 +35,7 @@ public void init(CompilerPluginContext pluginContext) { out.println(getStr().toCharArray()); } - @Nullable String getStr() { + String getStr() { return null; } } diff --git a/tests/jballerina-debugger-integration-test/src/main/java/org/ballerinalang/debugger/test/utils/DebugTestRunner.java b/tests/jballerina-debugger-integration-test/src/main/java/org/ballerinalang/debugger/test/utils/DebugTestRunner.java index cff83bd96e8f..cc60d3e55734 100644 --- a/tests/jballerina-debugger-integration-test/src/main/java/org/ballerinalang/debugger/test/utils/DebugTestRunner.java +++ b/tests/jballerina-debugger-integration-test/src/main/java/org/ballerinalang/debugger/test/utils/DebugTestRunner.java @@ -65,6 +65,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.Timer; @@ -169,7 +170,8 @@ public boolean initDebugSession(DebugUtils.DebuggeeExecutionKind executionKind, launchConfigs.put("terminal", terminalKind); } initDebugSession(executionKind, launchConfigs); - return debugClientConnector.getRequestManager().getDidRunInIntegratedTerminal(); + + return Objects.requireNonNull(debugClientConnector).getRequestManager().getDidRunInIntegratedTerminal(); } /** @@ -211,8 +213,9 @@ public void initDebugSession(DebugUtils.DebuggeeExecutionKind executionKind, Map public void initDebugSession(DebugUtils.DebuggeeExecutionKind executionKind, int port, Map launchArgs) throws BallerinaTestException { - debugClientConnector = new DAPClientConnector(balServer.getServerHome(), testProjectPath, testEntryFilePath, - port, clientSupportsRunInTerminal); + DAPClientConnector debugClientConnector = + new DAPClientConnector(balServer.getServerHome(), testProjectPath, testEntryFilePath, port, + clientSupportsRunInTerminal); debugClientConnector.createConnection(); if (debugClientConnector.isConnected()) { isConnected = true; @@ -230,6 +233,7 @@ public void initDebugSession(DebugUtils.DebuggeeExecutionKind executionKind, debugClientConnector.getRequestManager().setIsProjectBasedTest(isProjectBasedTest); launchDebuggee(executionKind, launchArgs); } + this.debugClientConnector = debugClientConnector; } private void attachToDebuggee() throws BallerinaTestException {