fuzion icon indicating copy to clipboard operation
fuzion copied to clipboard

parser: allow multiple lines in lambda block using parentheses (without extra code)

Open simonvonhackewitz opened this issue 8 months ago • 1 comments

fix #4425

simonvonhackewitz avatar Apr 23 '25 13:04 simonvonhackewitz

The change causes this errors

❯ FUZION_DISABLE_ANSI_ESCAPES=true make base-only                                                       
rm -rf build/modules/base
mkdir -p build/modules
cp -rf ./modules/base build/modules
./build/bin/fz -sourceDirs=./build/modules/base/src -XloadBaseModule=off -save-module=build/modules/base.fum -XenableSetKeyword

./build/modules/base/src/array3.fz:81:9: error 1: Inconsistent indentation
        + indices1
--------^
Indentation reference point is ./build/modules/base/src/array3.fz:80:8:
      ("  [" + ascii.lf_str
-------^
While parsing: exprs, parse stack: exprs, block (twice), klammer, bracketTerm, term, opTail, opExpr, operatorExpr (twice), expr, exprs, block (twice), implRout, routOrField, feature, expr, exprs, block (twice), implRout, routOrField, feature, expr, exprs, block (twice), implRout, routOrField, feature, expr, exprs, block (twice), unit


./build/modules/base/src/array3.fz:84:9: error 2: Inconsistent indentation
        + ascii.lf_str + "  ]")
--------^
Indentation reference point is ./build/modules/base/src/array3.fz:80:8:
      ("  [" + ascii.lf_str
-------^
While parsing: exprs, parse stack: exprs, block (twice), klammer, bracketTerm, term, opTail, opExpr, operatorExpr (twice), expr, exprs, block (twice), implRout, routOrField, feature, expr, exprs, block (twice), implRout, routOrField, feature, expr, exprs, block (twice), implRout, routOrField, feature, expr, exprs, block (twice), unit


./build/modules/base/src/array3.fz:92:7: error 3: Inconsistent indentation
      + indices0
------^
Indentation reference point is ./build/modules/base/src/array3.fz:91:6:
    ("[" + ascii.lf_str
-----^
While parsing: exprs, parse stack: exprs, block (twice), klammer, bracketTerm, term, opTail, opExpr, operatorExpr (twice), expr, exprs, block (twice), implRout, routOrField, feature, expr, exprs, block (twice), implRout, routOrField, feature, expr, exprs, block (twice), unit


./build/modules/base/src/array3.fz:95:7: error 4: Inconsistent indentation
      + ascii.lf_str + "]")
------^
Indentation reference point is ./build/modules/base/src/array3.fz:91:6:
    ("[" + ascii.lf_str
-----^
While parsing: exprs, parse stack: exprs, block (twice), klammer, bracketTerm, term, opTail, opExpr, operatorExpr (twice), expr, exprs, block (twice), implRout, routOrField, feature, expr, exprs, block (twice), implRout, routOrField, feature, expr, exprs, block (twice), unit


./build/modules/base/src/int.fz:95:23: error 5: Qualifier expected for '.this' expression.
    int (infix /).this.s n/other.n
----------------------^
Found expression ./build/modules/base/src/int.fz:95:10:
    int (infix /).this.s n/other.n
---------^^^^^^^ where a simple qualifier 'a.b.c' was expected


error 6: java.lang.IndexOutOfBoundsException: Index -1 out of bounds for length 2
        at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:100)
        at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:106)
        at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:302)
        at java.base/java.util.Objects.checkIndex(Objects.java:385)
        at java.base/java.util.ArrayList.get(ArrayList.java:427)
        at dev.flang.parser.OpExpr.op(OpExpr.java:295)
        at dev.flang.parser.OpExpr.toExpr(OpExpr.java:197)
        at dev.flang.parser.Parser.opExpr(Parser.java:1889)
        at dev.flang.parser.Parser.operatorExpr(Parser.java:1842)
        at dev.flang.parser.Parser.operatorExpr(Parser.java:1838)
        at dev.flang.parser.Parser.actualSpace(Parser.java:1804)
        at dev.flang.parser.Parser.actualSpaces(Parser.java:1759)
        at dev.flang.parser.Parser.actualArgs(Parser.java:1633)
        at dev.flang.parser.Parser.call(Parser.java:1384)
        at dev.flang.parser.Parser.call(Parser.java:1349)
        at dev.flang.parser.Parser.call0(Parser.java:3196)
        at dev.flang.parser.Parser.callOrFeatOrThis(Parser.java:3182)
        at dev.flang.parser.Parser.term(Parser.java:2144)
        at dev.flang.parser.Parser.opTail(Parser.java:1936)
        at dev.flang.parser.Parser.opExpr(Parser.java:1888)
        at dev.flang.parser.Parser.operatorExpr(Parser.java:1842)
        at dev.flang.parser.Parser.operatorExpr(Parser.java:1838)
        at dev.flang.parser.Parser.expr(Parser.java:2707)
        at dev.flang.parser.Parser.exprs(Parser.java:2542)
        at dev.flang.parser.Parser.lambda$block$17(Parser.java:2484)
        at dev.flang.parser.Lexer.optionalBrackets(Lexer.java:982)
        at dev.flang.parser.Parser.block(Parser.java:2484)
        at dev.flang.parser.Parser.block(Parser.java:2479)
        at dev.flang.parser.Parser.implRout(Parser.java:3427)
        at dev.flang.parser.Parser.routOrField(Parser.java:309)
        at dev.flang.parser.Parser.feature(Parser.java:270)
        at dev.flang.parser.Parser.expr(Parser.java:2707)
        at dev.flang.parser.Parser.exprs(Parser.java:2542)
        at dev.flang.parser.Parser.lambda$block$17(Parser.java:2484)
        at dev.flang.parser.Lexer.optionalBrackets(Lexer.java:982)
        at dev.flang.parser.Parser.block(Parser.java:2484)
        at dev.flang.parser.Parser.block(Parser.java:2479)
        at dev.flang.parser.Parser.implRout(Parser.java:3427)
        at dev.flang.parser.Parser.routOrField(Parser.java:309)
        at dev.flang.parser.Parser.feature(Parser.java:270)
        at dev.flang.parser.Parser.expr(Parser.java:2707)
        at dev.flang.parser.Parser.exprs(Parser.java:2542)
        at dev.flang.parser.Parser.lambda$block$17(Parser.java:2484)
        at dev.flang.parser.Lexer.optionalBrackets(Lexer.java:982)
        at dev.flang.parser.Parser.block(Parser.java:2484)
        at dev.flang.parser.Parser.block(Parser.java:2479)
        at dev.flang.parser.Parser.unit(Parser.java:207)
        at dev.flang.fe.SourceModule.parseFile(SourceModule.java:213)
        at dev.flang.fe.SourceModule.parseAndGetFeatures(SourceModule.java:226)
        at dev.flang.fe.SourceModule.lambda$loadInnerFeatures$2(SourceModule.java:425)
        at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:184)
        at java.base/java.util.ArrayList.forEach(ArrayList.java:1596)
        at java.base/java.util.stream.SortedOps$RefSortingSink.end(SortedOps.java:395)
        at java.base/java.util.stream.Sink$ChainedReference.end(Sink.java:261)
        at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:510)
        at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
        at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:151)
        at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:174)
        at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
        at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
        at dev.flang.fe.SourceModule.loadInnerFeatures(SourceModule.java:423)
        at dev.flang.fe.SourceModule.findDeclaredOrInheritedFeatures(SourceModule.java:831)
        at dev.flang.ast.Feature.resolveDeclarations(Feature.java:1404)
        at dev.flang.ast.Resolution.resolveOne(Resolution.java:417)
        at dev.flang.ast.Resolution.resolve(Resolution.java:392)
        at dev.flang.fe.SourceModule.createASTandResolve(SourceModule.java:261)
        at dev.flang.fe.FrontEnd.<init>(FrontEnd.java:166)
        at dev.flang.tools.Fuzion.lambda$parseArgsForBackend$4(Fuzion.java:1135)
        at dev.flang.tools.Tool.lambda$run$0(Tool.java:142)
        at dev.flang.util.Errors.runAndExit(Errors.java:903)
        at dev.flang.tools.Tool.run(Tool.java:142)
        at dev.flang.tools.Fuzion.main(Fuzion.java:688)

*** fatal errors encountered, stopping.
6 errors.
make: *** [Makefile:660: build/modules/base.fum] Error 1

The indentation errors are caused by the parentheses and indentation in this code, if either is fixed it works

array3.fz:78

    dim_1(i i32) =>
      ("  [" + ascii.lf_str
        + indices1
            .map (j -> dim_2 i j)
            .fold (String.concat ("," + ascii.lf_str))
        + ascii.lf_str + "  ]")

simonvonhackewitz avatar Apr 23 '25 13:04 simonvonhackewitz

@simonvonhackewitz: I think this can be closed with #5536 basically solving that issue.

fridis avatar Jul 16 '25 14:07 fridis