Skip to content

Commit

Permalink
Merge pull request #42093 from nipunayf/fix-42013
Browse files Browse the repository at this point in the history
Support `create function` CA for workers and explicitly defined anonymous functions
  • Loading branch information
KavinduZoysa authored Feb 7, 2024
2 parents fe04960 + 43a099e commit 53730b9
Show file tree
Hide file tree
Showing 14 changed files with 654 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,14 @@
import io.ballerina.compiler.api.symbols.TypeSymbol;
import io.ballerina.compiler.api.symbols.UnionTypeSymbol;
import io.ballerina.compiler.api.symbols.VariableSymbol;
import io.ballerina.compiler.api.symbols.WorkerSymbol;
import io.ballerina.compiler.syntax.tree.AssignmentStatementNode;
import io.ballerina.compiler.syntax.tree.BinaryExpressionNode;
import io.ballerina.compiler.syntax.tree.BlockStatementNode;
import io.ballerina.compiler.syntax.tree.CheckExpressionNode;
import io.ballerina.compiler.syntax.tree.ConditionalExpressionNode;
import io.ballerina.compiler.syntax.tree.ErrorConstructorExpressionNode;
import io.ballerina.compiler.syntax.tree.ExplicitAnonymousFunctionExpressionNode;
import io.ballerina.compiler.syntax.tree.ExplicitNewExpressionNode;
import io.ballerina.compiler.syntax.tree.FailStatementNode;
import io.ballerina.compiler.syntax.tree.FunctionArgumentNode;
Expand All @@ -57,6 +59,7 @@
import io.ballerina.compiler.syntax.tree.MethodCallExpressionNode;
import io.ballerina.compiler.syntax.tree.ModuleVariableDeclarationNode;
import io.ballerina.compiler.syntax.tree.NamedArgumentNode;
import io.ballerina.compiler.syntax.tree.NamedWorkerDeclarationNode;
import io.ballerina.compiler.syntax.tree.Node;
import io.ballerina.compiler.syntax.tree.NodeVisitor;
import io.ballerina.compiler.syntax.tree.ObjectFieldNode;
Expand Down Expand Up @@ -402,6 +405,12 @@ public void visit(BlockStatementNode node) {
node.parent().accept(this);
}

@Override
public void visit(NamedWorkerDeclarationNode namedWorkerDeclarationNode) {
semanticModel.symbol(namedWorkerDeclarationNode)
.ifPresent(value -> checkAndSetTypeResult(((WorkerSymbol) value).returnType()));
}

@Override
public void visit(ReturnStatementNode returnStatementNode) {
this.semanticModel.typeOf(returnStatementNode).ifPresent(this::checkAndSetTypeResult);
Expand All @@ -411,11 +420,14 @@ public void visit(ReturnStatementNode returnStatementNode) {

// Get function type symbol and get return type descriptor from it
returnStatementNode.parent().accept(this);
if (resultFound && returnTypeSymbol.typeKind() == TypeDescKind.FUNCTION) {

if (!resultFound) {
resetResult();
return;
}
if (returnTypeSymbol.typeKind() == TypeDescKind.FUNCTION) {
FunctionTypeSymbol functionTypeSymbol = (FunctionTypeSymbol) returnTypeSymbol;
functionTypeSymbol.returnTypeDescriptor().ifPresentOrElse(this::checkAndSetTypeResult, this::resetResult);
} else {
resetResult();
}
}

Expand Down Expand Up @@ -512,6 +524,11 @@ public void visit(ImplicitAnonymousFunctionExpressionNode expr) {
}
}

@Override
public void visit(ExplicitAnonymousFunctionExpressionNode explicitAnonymousFunctionExpressionNode) {
semanticModel.typeOf(explicitAnonymousFunctionExpressionNode).ifPresent(this::checkAndSetTypeResult);
}

@Override
public void visit(PanicStatementNode panicStatementNode) {
checkAndSetTypeResult(semanticModel.types().ERROR);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,18 @@ public Object[][] dataProvider() {

{"create_function_in_anonymous_function1.json"},
{"create_function_in_anonymous_function2.json"},

{"create_function_in_worker1.json"},
{"create_function_in_worker2.json"},
{"create_function_in_worker3.json"},
{"create_function_in_worker4.json"},
{"create_function_in_worker5.json"},

{"create_function_in_explicit_anonymous_function1.json"},
{"create_function_in_explicit_anonymous_function2.json"},
{"create_function_in_explicit_anonymous_function3.json"},
{"create_function_in_explicit_anonymous_function4.json"},
{"create_function_in_explicit_anonymous_function5.json"}
};
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
{
"position": {
"line": 4,
"character": 16
},
"source": "create_function_in_explicit_anonymous_function.bal",
"expected": [
{
"title": "Create function 'foo(...)'",
"kind": "quickfix",
"edits": [
{
"range": {
"start": {
"line": 25,
"character": 1
},
"end": {
"line": 25,
"character": 1
}
},
"newText": "\n\nfunction foo() returns int {\n return 0;\n}"
}
],
"resolvable": true,
"data": {
"extName": "org.ballerinalang.langserver.codeaction.BallerinaCodeActionExtension",
"codeActionName": "Create Function",
"fileUri": "create_function_in_explicit_anonymous_function.bal",
"range": {
"start": {
"line": 4,
"character": 15
},
"end": {
"line": 4,
"character": 20
}
},
"actionData": {
"key": "node.range",
"value": {
"start": {
"line": 4.0,
"character": 15.0
},
"end": {
"line": 4.0,
"character": 20.0
}
}
}
}
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
{
"position": {
"line": 8,
"character": 10
},
"source": "create_function_in_explicit_anonymous_function.bal",
"expected": [
{
"title": "Create function 'foo(...)'",
"kind": "quickfix",
"edits": [
{
"range": {
"start": {
"line": 25,
"character": 1
},
"end": {
"line": 25,
"character": 1
}
},
"newText": "\n\nfunction foo(int i) {\n \n}"
}
],
"resolvable": true,
"data": {
"extName": "org.ballerinalang.langserver.codeaction.BallerinaCodeActionExtension",
"codeActionName": "Create Function",
"fileUri": "create_function_in_explicit_anonymous_function.bal",
"range": {
"start": {
"line": 8,
"character": 8
},
"end": {
"line": 8,
"character": 15
}
},
"actionData": {
"key": "node.range",
"value": {
"start": {
"line": 8.0,
"character": 8.0
},
"end": {
"line": 8.0,
"character": 15.0
}
}
}
}
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
{
"position": {
"line": 13,
"character": 17
},
"source": "create_function_in_explicit_anonymous_function.bal",
"expected": [
{
"title": "Create function 'foo(...)'",
"kind": "quickfix",
"edits": [
{
"range": {
"start": {
"line": 25,
"character": 1
},
"end": {
"line": 25,
"character": 1
}
},
"newText": "\n\nfunction foo() {\n \n}"
}
],
"resolvable": true,
"data": {
"extName": "org.ballerinalang.langserver.codeaction.BallerinaCodeActionExtension",
"codeActionName": "Create Function",
"fileUri": "create_function_in_explicit_anonymous_function.bal",
"range": {
"start": {
"line": 13,
"character": 15
},
"end": {
"line": 13,
"character": 20
}
},
"actionData": {
"key": "node.range",
"value": {
"start": {
"line": 13.0,
"character": 15.0
},
"end": {
"line": 13.0,
"character": 20.0
}
}
}
}
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
{
"position": {
"line": 17,
"character": 17
},
"source": "create_function_in_explicit_anonymous_function.bal",
"expected": [
{
"title": "Create function 'foo(...)'",
"kind": "quickfix",
"edits": [
{
"range": {
"start": {
"line": 25,
"character": 1
},
"end": {
"line": 25,
"character": 1
}
},
"newText": "\n\nfunction foo() returns module1:TestRecord2 {\n return {};\n}"
}
],
"resolvable": true,
"data": {
"extName": "org.ballerinalang.langserver.codeaction.BallerinaCodeActionExtension",
"codeActionName": "Create Function",
"fileUri": "create_function_in_explicit_anonymous_function.bal",
"range": {
"start": {
"line": 17,
"character": 15
},
"end": {
"line": 17,
"character": 20
}
},
"actionData": {
"key": "node.range",
"value": {
"start": {
"line": 17.0,
"character": 15.0
},
"end": {
"line": 17.0,
"character": 20.0
}
}
}
}
}
]
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
{
"position": {
"line": 22,
"character": 22
},
"source": "create_function_in_explicit_anonymous_function.bal",
"expected": [
{
"title": "Create function 'foo(...)'",
"kind": "quickfix",
"edits": [
{
"range": {
"start": {
"line": 25,
"character": 1
},
"end": {
"line": 25,
"character": 1
}
},
"newText": "\n\nfunction foo() returns int {\n return 0;\n}"
}
],
"resolvable": true,
"data": {
"extName": "org.ballerinalang.langserver.codeaction.BallerinaCodeActionExtension",
"codeActionName": "Create Function",
"fileUri": "create_function_in_explicit_anonymous_function.bal",
"range": {
"start": {
"line": 22,
"character": 19
},
"end": {
"line": 22,
"character": 24
}
},
"actionData": {
"key": "node.range",
"value": {
"start": {
"line": 22.0,
"character": 19.0
},
"end": {
"line": 22.0,
"character": 24.0
}
}
}
}
}
]
}
Loading

0 comments on commit 53730b9

Please sign in to comment.