Ballerina-lang: Bad, Sad error when invoking a service method via a service object

Created on 17 Aug 2019  路  4Comments  路  Source: ballerina-platform/ballerina-lang

Description:
$title.

Happens for both normal methods and resources.

Works for service declarations (an attempt to invoke a resource function also gives an error).

Steps to reproduce:

import ballerina/io;

service s = service {
    resource function foo() {
        io:println("foo");
    }

    function bar() {
        io:println("bar");        
    }
};

public function main() {
    s.foo();
    s.bar();
}

ballerina-internal.log

[2019-08-17 11:04:33,471] ERROR {org.ballerinalang.tool.Main} - org.wso2.ballerinalang.compiler.semantics.model.symbols.BTypeSymbol cannot be cast to org.wso2.ballerinalang.compiler.semantics.model.symbols.BObjectTypeSymbol 
java.lang.ClassCastException: org.wso2.ballerinalang.compiler.semantics.model.symbols.BTypeSymbol cannot be cast to org.wso2.ballerinalang.compiler.semantics.model.symbols.BObjectTypeSymbol
    at org.wso2.ballerinalang.compiler.semantics.analyzer.TypeChecker.checkObjectFunctionInvocationExpr(TypeChecker.java:3050)
    at org.wso2.ballerinalang.compiler.semantics.analyzer.TypeChecker.visit(TypeChecker.java:1528)
    at org.wso2.ballerinalang.compiler.tree.expressions.BLangInvocation.accept(BLangInvocation.java:123)
    at org.wso2.ballerinalang.compiler.semantics.analyzer.TypeChecker.checkExpr(TypeChecker.java:248)
    at org.wso2.ballerinalang.compiler.semantics.analyzer.TypeChecker.checkExpr(TypeChecker.java:215)
    at org.wso2.ballerinalang.compiler.semantics.analyzer.SemanticAnalyzer.visit(SemanticAnalyzer.java:1846)
    at org.wso2.ballerinalang.compiler.tree.statements.BLangExpressionStmt.accept(BLangExpressionStmt.java:47)
    at org.wso2.ballerinalang.compiler.semantics.analyzer.SemanticAnalyzer.analyzeNode(SemanticAnalyzer.java:2249)
    at org.wso2.ballerinalang.compiler.semantics.analyzer.SemanticAnalyzer.analyzeNode(SemanticAnalyzer.java:2214)
    at org.wso2.ballerinalang.compiler.semantics.analyzer.SemanticAnalyzer.analyzeStmt(SemanticAnalyzer.java:2210)
    at org.wso2.ballerinalang.compiler.semantics.analyzer.SemanticAnalyzer.lambda$visit$42(SemanticAnalyzer.java:1375)
    at java.util.ArrayList.forEach(ArrayList.java:1257)
    at org.wso2.ballerinalang.compiler.semantics.analyzer.SemanticAnalyzer.visit(SemanticAnalyzer.java:1375)
    at org.wso2.ballerinalang.compiler.tree.statements.BLangBlockStmt.accept(BLangBlockStmt.java:56)
    at org.wso2.ballerinalang.compiler.semantics.analyzer.SemanticAnalyzer.analyzeNode(SemanticAnalyzer.java:2249)
    at org.wso2.ballerinalang.compiler.semantics.analyzer.SemanticAnalyzer.analyzeNode(SemanticAnalyzer.java:2214)
    at org.wso2.ballerinalang.compiler.semantics.analyzer.SemanticAnalyzer.analyzeStmt(SemanticAnalyzer.java:2210)
    at org.wso2.ballerinalang.compiler.semantics.analyzer.SemanticAnalyzer.visit(SemanticAnalyzer.java:313)
    at org.wso2.ballerinalang.compiler.tree.BLangFunction.accept(BLangFunction.java:71)
    at org.wso2.ballerinalang.compiler.semantics.analyzer.SemanticAnalyzer.analyzeNode(SemanticAnalyzer.java:2249)
    at org.wso2.ballerinalang.compiler.semantics.analyzer.SemanticAnalyzer.analyzeNode(SemanticAnalyzer.java:2214)
    at org.wso2.ballerinalang.compiler.semantics.analyzer.SemanticAnalyzer.analyzeDef(SemanticAnalyzer.java:2206)
    at org.wso2.ballerinalang.compiler.semantics.analyzer.SemanticAnalyzer.lambda$visit$4(SemanticAnalyzer.java:232)
    at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
    at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
    at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
    at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
    at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
    at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
    at org.wso2.ballerinalang.compiler.semantics.analyzer.SemanticAnalyzer.visit(SemanticAnalyzer.java:232)
    at org.wso2.ballerinalang.compiler.tree.BLangPackage.accept(BLangPackage.java:160)
    at org.wso2.ballerinalang.compiler.semantics.analyzer.SemanticAnalyzer.analyze(SemanticAnalyzer.java:211)
    at org.wso2.ballerinalang.compiler.CompilerDriver.typeCheck(CompilerDriver.java:313)
    at org.wso2.ballerinalang.compiler.CompilerDriver.compile(CompilerDriver.java:270)
    at org.wso2.ballerinalang.compiler.CompilerDriver.compilePackageSymbol(CompilerDriver.java:262)
    at org.wso2.ballerinalang.compiler.CompilerDriver.compilePackage(CompilerDriver.java:127)
    at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
    at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
    at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
    at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
    at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
    at org.wso2.ballerinalang.compiler.Compiler.compilePackages(Compiler.java:175)
    at org.wso2.ballerinalang.compiler.Compiler.compilePackage(Compiler.java:180)
    at org.wso2.ballerinalang.compiler.Compiler.compile(Compiler.java:93)
    at org.wso2.ballerinalang.compiler.Compiler.build(Compiler.java:101)
    at org.ballerinalang.packerina.task.CompileTask.execute(CompileTask.java:51)
    at org.ballerinalang.packerina.TaskExecutor.executeTasks(TaskExecutor.java:38)
    at org.ballerinalang.packerina.cmd.RunCommand.execute(RunCommand.java:298)
    at java.util.Optional.ifPresent(Optional.java:159)
    at org.ballerinalang.tool.Main.main(Main.java:57)

Affected Versions:
Ballerina 1.0.0-beta-SNAPSHOT - 15th August build

AreCompiler PrioritHigh TeaCompilerFE TypBug

All 4 comments

Same happens when trying to access a field in a service object - fields are not allowed anyway, but it should give the proper error.

ballerina-internal.log

[2019-08-17 11:39:11,250] ERROR {org.ballerinalang.tool.Main} - null 
java.lang.NullPointerException
    at org.wso2.ballerinalang.compiler.semantics.analyzer.SymbolResolver.lookupMemberSymbol(SymbolResolver.java:891)
    at org.wso2.ballerinalang.compiler.semantics.analyzer.SymbolResolver.resolveStructField(SymbolResolver.java:656)
    at org.wso2.ballerinalang.compiler.semantics.analyzer.TypeChecker.checkObjectFieldAccess(TypeChecker.java:3512)
    at org.wso2.ballerinalang.compiler.semantics.analyzer.TypeChecker.checkObjectFieldAccessExpr(TypeChecker.java:3727)
    at org.wso2.ballerinalang.compiler.semantics.analyzer.TypeChecker.checkFieldAccessExpr(TypeChecker.java:3862)
    at org.wso2.ballerinalang.compiler.semantics.analyzer.TypeChecker.visit(TypeChecker.java:1471)
    at org.wso2.ballerinalang.compiler.tree.expressions.BLangFieldBasedAccess.accept(BLangFieldBasedAccess.java:62)
    at org.wso2.ballerinalang.compiler.semantics.analyzer.TypeChecker.checkExpr(TypeChecker.java:248)
    at org.wso2.ballerinalang.compiler.semantics.analyzer.TypeChecker.checkExpr(TypeChecker.java:215)
    at org.wso2.ballerinalang.compiler.semantics.analyzer.SemanticAnalyzer.visit(SemanticAnalyzer.java:1846)
    at org.wso2.ballerinalang.compiler.tree.statements.BLangExpressionStmt.accept(BLangExpressionStmt.java:47)
    at org.wso2.ballerinalang.compiler.semantics.analyzer.SemanticAnalyzer.analyzeNode(SemanticAnalyzer.java:2249)
    at org.wso2.ballerinalang.compiler.semantics.analyzer.SemanticAnalyzer.analyzeNode(SemanticAnalyzer.java:2214)
    at org.wso2.ballerinalang.compiler.semantics.analyzer.SemanticAnalyzer.analyzeStmt(SemanticAnalyzer.java:2210)
    at org.wso2.ballerinalang.compiler.semantics.analyzer.SemanticAnalyzer.lambda$visit$42(SemanticAnalyzer.java:1375)
    at java.util.ArrayList.forEach(ArrayList.java:1257)
    at org.wso2.ballerinalang.compiler.semantics.analyzer.SemanticAnalyzer.visit(SemanticAnalyzer.java:1375)
    at org.wso2.ballerinalang.compiler.tree.statements.BLangBlockStmt.accept(BLangBlockStmt.java:56)
    at org.wso2.ballerinalang.compiler.semantics.analyzer.SemanticAnalyzer.analyzeNode(SemanticAnalyzer.java:2249)
    at org.wso2.ballerinalang.compiler.semantics.analyzer.SemanticAnalyzer.analyzeNode(SemanticAnalyzer.java:2214)
    at org.wso2.ballerinalang.compiler.semantics.analyzer.SemanticAnalyzer.analyzeStmt(SemanticAnalyzer.java:2210)
    at org.wso2.ballerinalang.compiler.semantics.analyzer.SemanticAnalyzer.visit(SemanticAnalyzer.java:313)
    at org.wso2.ballerinalang.compiler.tree.BLangFunction.accept(BLangFunction.java:71)
    at org.wso2.ballerinalang.compiler.semantics.analyzer.SemanticAnalyzer.analyzeNode(SemanticAnalyzer.java:2249)
    at org.wso2.ballerinalang.compiler.semantics.analyzer.SemanticAnalyzer.analyzeNode(SemanticAnalyzer.java:2214)
    at org.wso2.ballerinalang.compiler.semantics.analyzer.SemanticAnalyzer.analyzeDef(SemanticAnalyzer.java:2206)
    at org.wso2.ballerinalang.compiler.semantics.analyzer.SemanticAnalyzer.lambda$visit$4(SemanticAnalyzer.java:232)
    at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
    at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
    at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
    at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
    at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
    at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
    at org.wso2.ballerinalang.compiler.semantics.analyzer.SemanticAnalyzer.visit(SemanticAnalyzer.java:232)
    at org.wso2.ballerinalang.compiler.tree.BLangPackage.accept(BLangPackage.java:160)
    at org.wso2.ballerinalang.compiler.semantics.analyzer.SemanticAnalyzer.analyze(SemanticAnalyzer.java:211)
    at org.wso2.ballerinalang.compiler.CompilerDriver.typeCheck(CompilerDriver.java:313)
    at org.wso2.ballerinalang.compiler.CompilerDriver.compile(CompilerDriver.java:270)
    at org.wso2.ballerinalang.compiler.CompilerDriver.compilePackageSymbol(CompilerDriver.java:262)
    at org.wso2.ballerinalang.compiler.CompilerDriver.compilePackage(CompilerDriver.java:127)
    at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
    at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
    at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
    at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
    at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
    at org.wso2.ballerinalang.compiler.Compiler.compilePackages(Compiler.java:175)
    at org.wso2.ballerinalang.compiler.Compiler.compilePackage(Compiler.java:180)
    at org.wso2.ballerinalang.compiler.Compiler.compile(Compiler.java:93)
    at org.wso2.ballerinalang.compiler.Compiler.build(Compiler.java:101)
    at org.ballerinalang.packerina.task.CompileTask.execute(CompileTask.java:51)
    at org.ballerinalang.packerina.TaskExecutor.executeTasks(TaskExecutor.java:38)
    at org.ballerinalang.packerina.cmd.RunCommand.execute(RunCommand.java:298)
    at java.util.Optional.ifPresent(Optional.java:159)
    at org.ballerinalang.tool.Main.main(Main.java:57)

@irshadnilam @MaryamZi Spec allows this, but let's restrict this usage from the compiler.

service x = service {
 public function foo();   // Let's remove access modifiers from the compiler side. the only default is allowed.
}

x.foo(); // This is not supported.

Spec issue is fixed now. https://github.com/ballerina-platform/ballerina-spec/issues/325, Let's restrict this from model builder level without a grammar change.

Spec issue is fixed now. ballerina-platform/ballerina-spec#325, Let's restrict this from model builder level without a grammar change.

@hasithaa @MaryamZi I will work on this.

Was this page helpful?
0 / 5 - 0 ratings