ballerina-lang
ballerina-lang copied to clipboard
[Bug]: `semanticModel.references(symbol)` gives invalid reference count for object method parameters.
Description
For the code mention in [1], When I am try to find the references of the objParam parameter inside the method in the module level object declaration using the semanticModel, it gives the result as 4. But the actual value should be 2.
[1] -
import ballerina/http;
type IncludedRecord record {int a;};
public function testExprFunctions(int a, int b, int c) { // warning * 2
[1,2].forEach(element => ()); // warning
[1,2].forEach(element => doNothing(element + c));
}
function (int, int) returns int anonFunc1 = (x, y) => x + y;
function (int, int) returns int anonFunc2 = function (int x, int y) returns int => x + y;
public function anonFunc4(int a) => [1,2].forEach(element => doNothing(element)); // warning
public function anonFunc3(int a) => [1,2].forEach(element => doNothing(a)); // warning
function (int, int) returns int anonFunc5 = (x, y) => x; // warning
function (int, int) returns int anonFunc6 = function (int x, int y) returns int => x; // warning
public function anonFunc7(int a, int b) => [1,2].forEach(element => doNothing(b)); // warning * 2
type F function (int, int) returns int;
type R record {
F f = (a, b) => a; // BUG: https://github.com/ballerina-platform/ballerina-lang/issues/43474
F antherF = function(int a, int b) returns int { // warning
return b;
};
};
public function testInlineFunctionDecl() {
F[] arr = [
(a, b) => a, // warning
function(int a, int b) returns int { // warning
return b;
}
];
}
function test(int a, int b) returns int {
return a + b;
}
function test2(int a, int b) returns int => a + b;
function test3(int a, int b, int c) returns int { // warning
return a + b;
}
function test4(int a, int b, int c) returns int => a + b; // warning
function test5(int a, int b, int c, int d) returns int { // warning * 2
return test(a, b);
}
function test6(int a, int b, int c, int d) returns int => test(a, b); // warning * 2
function test7(int a, int b, int c = 3) returns int {
return a + b + c;
}
function test8(int a, int b, int c = 3) returns int { //warning
return a + b;
}
function test9(int a, int b, int c = 3) returns int => a + b; // warning
function test10(int a, int b, int c = 3) returns int => c + test(a, b);
function test11(int a, int b, int... c) returns string => a.toString(); // warning * 2
function test12(int a, int b, int... c) returns string { // warning * 2
return a.toString();
}
class A {
function test(int a, int b) returns int {
return a + b;
}
function test2(int a, int b) returns int => a + b;
function test3(int a, int b, int c) returns int { // warning
return a + b;
}
function test4(int a, int b, int c) returns int => a + b; // warning
function test5(int a, int b, int c, int d) returns int { // warning * 2
return test(a, b);
}
function test6(int a, int b, int c, int d) returns int => test(a, b); // warning * 2
function test7(int a, int b, int c = 3) returns int {
return a + b + c;
}
function test8(int a, int b, int c = 3) returns int { // warning
return a + b;
}
function test9(int a, int b, int c = 3) returns int => a + b; // warning
function test10(int a, int b, int c = 3) returns int => c + test(a, b);
function test11(int a, int b, int... c) returns string => a.toString(); // warning * 2
function test12(int a, int b, int... c) returns string { // warning * 2
return a.toString();
}
function testIncludedParams(*IncludedRecord o) {// warning
return;
}
function testIncludedParams2(*IncludedRecord o) {
doNothing(o);
return;
}
}
service /a on new http:Listener(8080) {
resource function get test(int a, int b) returns int {
return a + b;
}
resource function get test2(int a, int b) returns int => a + b;
resource function get test3(int a, int b, int c) returns int { // warning
return a + b;
}
resource function post test4(int a, int b, int c) returns int => a + b; // warning
resource function post test5(int a, int b, int c, int d) returns int { // warning * 2
return test(a, b);
}
resource function post test6(int a, int b, int c, int d) returns int => test(a, b); // warning * 2
resource function post test7(int a, int b, int c = 3) returns int {
return a + b + c;
}
resource function post test8(int a, int b, int c = 3) returns int { // warning
return a + b;
}
resource function post test9(int a, int b, int c = 3) returns int => a + b; // warning
resource function post test10(int a, int b, int c = 3) returns int => c + test(a, b);
resource function post test11(int a, int b, int... c) returns string => a.toString(); // warning * 2
resource function post test12(int a, int b, int... c) returns string { // warning * 2
return a.toString();
}
function testIncludedParams(*IncludedRecord o) {// warning
return;
}
function testIncludedParams2(*IncludedRecord o) {
doNothing(o);
return;
}
}
object {} a = object {
function test(int a, int b) returns int {
return a + b;
}
function test2(int a, int b) returns int => a + b;
function test3(int objParam, int b, int c) returns int { // warning
return objParam + b;
}
remote function test4(int a, int b, int c) returns int => a + b; // warning
remote function test5(int a, int b, int c, int d) returns int { // warning * 2
return test(a, b);
}
function test6(int a, int b, int c, int d) returns int => test(a, b); // warning * 2
function test7(int a, int b, int c = 3) returns int {
return a + b + c;
}
function test8(int a, int b, int c = 3) returns int { // warning
return a + b;
}
remote function test9(int a, int b, int c = 3) returns int => a + b; // warning
function test10(int a, int b, int c = 3) returns int => c + test(a, b);
function test11(int a, int b, int... c) returns string => a.toString(); // warning * 2
function test12(int a, int b, int... c) returns string { // warning * 2
return a.toString();
}
function testIncludedParams(*IncludedRecord o) {// warning
return;
}
function testIncludedParams2(*IncludedRecord o) {
doNothing(o);
return;
}
};
public function main(int a, int b, int c) { // warning
_ = test(a, c);
[1,2].forEach(element => ()); // warning
[1,2].forEach(element => doNothing(element));
}
function doNothing(any a) { // warning
return;
}
public function t(int a, int b, int c) { // warning * 2
var fn = function(int a2, int b2) returns int => b; // warning * 2
int _ = fn(1,2);
}
function testIncludedParams(*IncludedRecord includedparam) {// warning
return;
}
function testIncludedParams2(*IncludedRecord includedparam) {
doNothing(includedparam);
return;
}
Steps to Reproduce
No response
Affected Version(s)
No response
OS, DB, other environment details and versions
No response
Related area
-> Compilation
Related issue(s) (optional)
No response
Suggested label(s) (optional)
No response
Suggested assignee(s) (optional)
No response