Project

General

Profile

Feature #5160

About cast() function support

Added by Deividas Varzgalys about 3 years ago. Updated about 3 years ago.

Status:
New
Priority:
Normal
Assignee:
Target version:
-
Start date:
Due date:
% Done:

0%

billable:
No
vendor_id:
GCD

Related issues

Related to Base Language - Feature #4350: method overload when they differ by a temp-table, dataset, buffer or object or extent or parameter modes WIP

History

#1 Updated by Greg Shah about 3 years ago

  • Description updated (diff)
  • Start date deleted (02/23/2021)

From Deividas:

I have issue in conversion process that error show up with cast() function

cast(oPart, GeneralInfoPart):GetData(output table ttGeneralInfo).

Errors:
unexpected token: GetData
unexpected token: (
unexpected token: table

Does your tool support cast() function in that way?
If yes, then how it connects to app server?

#2 Updated by Greg Shah about 3 years ago

Does your tool support cast() function in that way?

Yes, FWD does support chaining a method call off of a cast() function. For example:

class oo.VoidMethodHelper:
   method public void helper():
   end.
end.
using oo.*.

def var obj as Progress.Lang.Object.

obj = new VoidMethodHelper().

cast(obj, VoidMethodHelper):helper().

This example converts and compiles without issue.

Some questions:

  • Is GeneralInfoPart your class?
  • Please post the stack trace associated with the first unexpected token: GetData.
  • Where there any other errors or warnings posted before that failure?

If yes, then how it connects to app server?

Is this connected to the cast() problem in some way? If it is separate, let's discuss that elsewhere.

#3 Updated by Deividas Varzgalys about 3 years ago

Yes, GeneralInfoPart is my class.

     [java] ./abl/*.p:741:37: unexpected token: GetData
     [java]     at com.goldencode.p2j.uast.ProgressParser.downstream_chained_reference(ProgressParser.java:58463)
     [java]     at com.goldencode.p2j.uast.ProgressParser.chained_object_members(ProgressParser.java:22239)
     [java]     at com.goldencode.p2j.uast.ProgressParser.un_type(ProgressParser.java:57914)
     [java]     at com.goldencode.p2j.uast.ProgressParser.prod_expr(ProgressParser.java:57781)
     [java]     at com.goldencode.p2j.uast.ProgressParser.sum_expr(ProgressParser.java:41695)
     [java]     at com.goldencode.p2j.uast.ProgressParser.compare_expr(ProgressParser.java:57367)
     [java]     at com.goldencode.p2j.uast.ProgressParser.log_not_expr(ProgressParser.java:57219)
     [java]     at com.goldencode.p2j.uast.ProgressParser.bitwise_xor_expr(ProgressParser.java:57150)
     [java]     at com.goldencode.p2j.uast.ProgressParser.log_and_expr(ProgressParser.java:57089)
     [java]     at com.goldencode.p2j.uast.ProgressParser.expr(ProgressParser.java:12197)
     [java]     at com.goldencode.p2j.uast.ProgressParser.assignment(ProgressParser.java:8710)
     [java]     at com.goldencode.p2j.uast.ProgressParser.single_block(ProgressParser.java:7353)
     [java]     at com.goldencode.p2j.uast.ProgressParser.block(ProgressParser.java:7036)
     [java]     at com.goldencode.p2j.uast.ProgressParser.inner_block(ProgressParser.java:8392)
     [java]     at com.goldencode.p2j.uast.ProgressParser.single_block(ProgressParser.java:7331)
     [java]     at com.goldencode.p2j.uast.ProgressParser.then_clause(ProgressParser.java:38845)
     [java]     at com.goldencode.p2j.uast.ProgressParser.if_stmt(ProgressParser.java:32522)
     [java]     at com.goldencode.p2j.uast.ProgressParser.stmt_list(ProgressParser.java:26434)
     [java]     at com.goldencode.p2j.uast.ProgressParser.statement(ProgressParser.java:8791)
     [java]     at com.goldencode.p2j.uast.ProgressParser.single_block(ProgressParser.java:7349)
     [java]     at com.goldencode.p2j.uast.ProgressParser.block(ProgressParser.java:7036)
     [java]     at com.goldencode.p2j.uast.ProgressParser.procedure(ProgressParser.java:7491)
     [java]     at com.goldencode.p2j.uast.ProgressParser.single_block(ProgressParser.java:7299)
     [java]     at com.goldencode.p2j.uast.ProgressParser.block(ProgressParser.java:7036)
     [java]     at com.goldencode.p2j.uast.ProgressParser.external_proc(ProgressParser.java:6963)
     [java]     at com.goldencode.p2j.uast.AstGenerator.parse(AstGenerator.java:1571)
     [java]     at com.goldencode.p2j.uast.AstGenerator.processFile(AstGenerator.java:996)
     [java]     at com.goldencode.p2j.uast.ScanDriver.lambda$scan$0(ScanDriver.java:375)
     [java]     at com.goldencode.p2j.uast.ScanDriver.scan(ScanDriver.java:410)
     [java]     at com.goldencode.p2j.uast.ScanDriver.scan(ScanDriver.java:248)
     [java]     at com.goldencode.p2j.convert.TransformDriver.runScanDriver(TransformDriver.java:370)
     [java]     at com.goldencode.p2j.convert.TransformDriver.front(TransformDriver.java:235)
     [java]     at com.goldencode.p2j.convert.TransformDriver.executeJob(TransformDriver.java:948)
     [java]     at com.goldencode.p2j.convert.ConversionDriver.main(ConversionDriver.java:1024)

Yes, I got few more recurring errors:
1. unexpected token: strict-entity-resolution
 hTempDoc:strict-entity-resolution = false.) 

It looks like that conversion not support strict-entity-resolution handle.

2.Error processing .*.p --- Caused by: java.lang.NullPointerException

     [java] Failure in file './*.p':
     [java] com.goldencode.ast.AstException: Error processing ./*.p
     [java]     at com.goldencode.p2j.uast.AstGenerator.processFile(AstGenerator.java:1008)
     [java]     at com.goldencode.p2j.uast.ScanDriver.lambda$scan$0(ScanDriver.java:375)
     [java]     at com.goldencode.p2j.uast.ScanDriver.scan(ScanDriver.java:410)
     [java]     at com.goldencode.p2j.uast.ScanDriver.scan(ScanDriver.java:248)
     [java]     at com.goldencode.p2j.convert.TransformDriver.runScanDriver(TransformDriver.java:370)
     [java]     at com.goldencode.p2j.convert.TransformDriver.front(TransformDriver.java:235)
     [java]     at com.goldencode.p2j.convert.TransformDriver.executeJob(TransformDriver.java:948)
     [java]     at com.goldencode.p2j.convert.ConversionDriver.main(ConversionDriver.java:1024)
     [java] Caused by: java.lang.NullPointerException
     [java]     at com.goldencode.p2j.uast.ProgressParser.isLvalue(ProgressParser.java:1286)
     [java]     at com.goldencode.p2j.uast.ProgressParser.un_type(ProgressParser.java:57918)
     [java]     at com.goldencode.p2j.uast.ProgressParser.prod_expr(ProgressParser.java:57781)
     [java]     at com.goldencode.p2j.uast.ProgressParser.sum_expr(ProgressParser.java:41695)
     [java]     at com.goldencode.p2j.uast.ProgressParser.compare_expr(ProgressParser.java:57367)
     [java]     at com.goldencode.p2j.uast.ProgressParser.log_not_expr(ProgressParser.java:57219)
     [java]     at com.goldencode.p2j.uast.ProgressParser.bitwise_xor_expr(ProgressParser.java:57150)
     [java]     at com.goldencode.p2j.uast.ProgressParser.log_and_expr(ProgressParser.java:57089)
     [java]     at com.goldencode.p2j.uast.ProgressParser.expr(ProgressParser.java:12197)
     [java]     at com.goldencode.p2j.uast.ProgressParser.assignment(ProgressParser.java:8710)
     [java]     at com.goldencode.p2j.uast.ProgressParser.single_block(ProgressParser.java:7353)
     [java]     at com.goldencode.p2j.uast.ProgressParser.block(ProgressParser.java:7036)
     [java]     at com.goldencode.p2j.uast.ProgressParser.function(ProgressParser.java:8229)
     [java]     at com.goldencode.p2j.uast.ProgressParser.single_block(ProgressParser.java:7327)
     [java]     at com.goldencode.p2j.uast.ProgressParser.block(ProgressParser.java:7036)
     [java]     at com.goldencode.p2j.uast.ProgressParser.external_proc(ProgressParser.java:6963)
     [java]     at com.goldencode.p2j.uast.AstGenerator.parse(AstGenerator.java:1571)
     [java]     at com.goldencode.p2j.uast.AstGenerator.processFile(AstGenerator.java:996)
     [java]     ... 7 more

For these errors I found that it breaks in lines where are creating new object with table input parameter.
For example:
lobj = new GlsClass( table static-tgls).

Looking forward to get solutions for these two additional errors too.

#4 Updated by Greg Shah about 3 years ago

unexpected token: strict-entity-resolution

Correct, in your version of FWD we did not recognise this attribute at parse time and of course there is never downstream conversion or runtime support for something that the parser does not recognise.

In branch 3821c revision 12055, I added:

  • parser support for missing attributes STRICT-ENTITY-RESOLUTION, XML-STRICT-ENTITY-RESOLUTION, ENTITY-EXPANSION-LIMIT and XML-ENTITY-EXPANSION-LIMIT
  • conversion support and runtime stubs for attributes STRICT-ENTITY-RESOLUTION and XML-STRICT-ENTITY-RESOLUTION

I've pushed this revision to xfer.goldencode.com. When you pull it down, make sure to do a full rebuild of FWD (e.g. ./gradlew core) and a clean/full run of the ConversionDriver. Parser changes cannot be accepted for incremental builds or conversion runs.

#5 Updated by Greg Shah about 3 years ago

./abl/*.p:741:37: unexpected token: GetData
...
2.Error processing .*.p --- Caused by: java.lang.NullPointerException

Do you have a 4GL source file named "*.p"? Technically, I think this will work on Linux, but it is not allowed on Windows. I am unsure if we have any code in FWD that may be sensitive to it since we do some amount of name processing using regular expressions and separately with support for wildcard characters (* and ?).

Regardless of whether this works, can you please retest the failing file using the latest FWD revision I just uploaded. Once you have a parser failure, subsequent failures can be caused by the first failure. If the first failure is gone and the subsequent failure(s) continue to occur, then please post a standalone sample of the 4GL code which I can use to recreate the problem. It is best to minimize this code so that it is easier to identify the root cause. A good example is the code I posted in #5160-2. If you can avoid database usage, even of temp-tables, that is also very useful because it makes the code easier to try out. We do support table parameters, but if that is part of the problem then do try to write the sample using temp-tables if possible.

#6 Updated by Deividas Varzgalys about 3 years ago

I just pasted "*" due to the data safety of current project source code names. This error occurs in filenames without "*" or "?".
This issue appears in every place where table is provided as an input or output parameter. I think that it is the same for that cast() issue in first my message (because it has table parameter too. If I comment that lines, then the conversion process doesn't show these errors.) I tried your suggestion with temp-tables, still errors appear.

#7 Updated by Greg Shah about 3 years ago

Please post a standalone example so that we can recreate the problem here.

#8 Updated by Deividas Varzgalys about 3 years ago

test.p file.

define temp-table tTest no-undo
  field testField as character.

define variable oSomeClass as SomeClass no-undo.

create tTest.
tTest.testField = "LOLOL".

define variable htTest as handle no-undo.

htTest = temp-table tTest:handle.

oSomeClass = new SomeClass(table tTest).

SomeClass.cls file.

using Progress.Lang.*.

block-level on error undo, throw.

class SomeClass:

    define temp-table tTest no-undo
    field testField as character.

    constructor public SomeClass(phTableHandle as handle):
        super().

        temp-table tTest:handle:copy-temp-table(phTableHandle).

        find first tTest no-error.

    end constructor.

    constructor public SomeClass(table tTest):
        super().

        find first tTest no-error.

    end constructor.

    method public void testMethod():

    end method.

end class.

Appears the same error as in my project which I am trying to convert.
If I try to create a SomeClass object with a handle, it works fine.

Failure in file './abl/test.p':
     [java] com.goldencode.ast.AstException: Error processing ./abl/test.p
     [java]     at com.goldencode.p2j.uast.AstGenerator.processFile(AstGenerator.java:1008)
     [java]     at com.goldencode.p2j.uast.ScanDriver.lambda$scan$0(ScanDriver.java:375)
     [java]     at com.goldencode.p2j.uast.ScanDriver.scan(ScanDriver.java:410)
     [java]     at com.goldencode.p2j.uast.ScanDriver.scan(ScanDriver.java:248)
     [java]     at com.goldencode.p2j.convert.TransformDriver.runScanDriver(TransformDriver.java:373)
     [java]     at com.goldencode.p2j.convert.TransformDriver.front(TransformDriver.java:238)
     [java]     at com.goldencode.p2j.convert.TransformDriver.executeJob(TransformDriver.java:951)
     [java]     at com.goldencode.p2j.convert.ConversionDriver.main(ConversionDriver.java:1024)
     [java] Caused by: java.lang.NullPointerException
     [java]     at com.goldencode.p2j.uast.ClassDefinition.isExtentMatch(ClassDefinition.java:3153)
     [java]     at com.goldencode.p2j.uast.ClassDefinition.annotateCallSignature(ClassDefinition.java:2781)
     [java]     at com.goldencode.p2j.uast.ClassDefinition.annotateMethodCall(ClassDefinition.java:1625)
     [java]     at com.goldencode.p2j.uast.SymbolResolver.annotateObjectMethod(SymbolResolver.java:4395)
     [java]     at com.goldencode.p2j.uast.ProgressParser.new_phrase(ProgressParser.java:59419)
     [java]     at com.goldencode.p2j.uast.ProgressParser.primary_expr(ProgressParser.java:58204)
     [java]     at com.goldencode.p2j.uast.ProgressParser.chained_object_members(ProgressParser.java:22208)
     [java]     at com.goldencode.p2j.uast.ProgressParser.un_type(ProgressParser.java:57927)
     [java]     at com.goldencode.p2j.uast.ProgressParser.prod_expr(ProgressParser.java:57794)
     [java]     at com.goldencode.p2j.uast.ProgressParser.sum_expr(ProgressParser.java:41708)
     [java]     at com.goldencode.p2j.uast.ProgressParser.compare_expr(ProgressParser.java:57380)
     [java]     at com.goldencode.p2j.uast.ProgressParser.log_not_expr(ProgressParser.java:57232)
     [java]     at com.goldencode.p2j.uast.ProgressParser.bitwise_xor_expr(ProgressParser.java:57163)
     [java]     at com.goldencode.p2j.uast.ProgressParser.log_and_expr(ProgressParser.java:57102)
     [java]     at com.goldencode.p2j.uast.ProgressParser.expr(ProgressParser.java:12210)
     [java]     at com.goldencode.p2j.uast.ProgressParser.un_type(ProgressParser.java:57950)
     [java]     at com.goldencode.p2j.uast.ProgressParser.prod_expr(ProgressParser.java:57794)
     [java]     at com.goldencode.p2j.uast.ProgressParser.sum_expr(ProgressParser.java:41708)
     [java]     at com.goldencode.p2j.uast.ProgressParser.compare_expr(ProgressParser.java:57380)
     [java]     at com.goldencode.p2j.uast.ProgressParser.log_not_expr(ProgressParser.java:57232)
     [java]     at com.goldencode.p2j.uast.ProgressParser.bitwise_xor_expr(ProgressParser.java:57163)
     [java]     at com.goldencode.p2j.uast.ProgressParser.log_and_expr(ProgressParser.java:57102)
     [java]     at com.goldencode.p2j.uast.ProgressParser.expr(ProgressParser.java:12210)
     [java]     at com.goldencode.p2j.uast.ProgressParser.assignment(ProgressParser.java:8723)
     [java]     at com.goldencode.p2j.uast.ProgressParser.single_block(ProgressParser.java:7366)
     [java]     at com.goldencode.p2j.uast.ProgressParser.block(ProgressParser.java:7049)
     [java]     at com.goldencode.p2j.uast.ProgressParser.external_proc(ProgressParser.java:6976)
     [java]     at com.goldencode.p2j.uast.AstGenerator.parse(AstGenerator.java:1571)
     [java]     at com.goldencode.p2j.uast.AstGenerator.processFile(AstGenerator.java:996)
     [java]     ... 7 more

#9 Updated by Greg Shah about 3 years ago

Coincidentally, I am already working on this root cause in #4350. The problem is that we need to better handle method and constructor overloading in several cases. I haven't gotten to the constructor case yet.

Are you also seeing this with regular methods or is your problem limited to constructors?

#10 Updated by Greg Shah about 3 years ago

  • Related to Feature #4350: method overload when they differ by a temp-table, dataset, buffer or object or extent or parameter modes added

#11 Updated by Deividas Varzgalys about 3 years ago

I have same issues with regular methods and constructors. Even regular method got same error with output table parameter without overload.

method public void getData(output table tCln):
end method. /* getData */

Also available in: Atom PDF