X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Finternal%2Felaboration%2Fdecomposed%2FDecomposedExpression.java;h=64e859253d39e16cbe62282b7f39355dd4f0553f;hb=976bf85e9915e294d39d2673d7f8bb90f6a70144;hp=f579d5c7688699c66ca5ff8cfed06b067fbb70af;hpb=969bd23cab98a79ca9101af33334000879fb60c5;p=simantics%2Fplatform.git diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/decomposed/DecomposedExpression.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/decomposed/DecomposedExpression.java index f579d5c76..64e859253 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/decomposed/DecomposedExpression.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/elaboration/decomposed/DecomposedExpression.java @@ -1,71 +1,72 @@ -package org.simantics.scl.compiler.internal.elaboration.decomposed; - -import java.util.ArrayList; - -import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; -import org.simantics.scl.compiler.elaboration.expressions.ELambdaType; -import org.simantics.scl.compiler.elaboration.expressions.ESimpleLambda; -import org.simantics.scl.compiler.elaboration.expressions.Expression; -import org.simantics.scl.compiler.elaboration.expressions.Variable; -import org.simantics.scl.compiler.top.SCLCompilerConfiguration; -import org.simantics.scl.compiler.types.TVar; -import org.simantics.scl.compiler.types.Type; -import org.simantics.scl.compiler.types.Types; - -public class DecomposedExpression { - public final TVar[] typeParameters; - public final Variable[] parameters; - public final Type[] parameterTypes; - public final Type effect; - public final Type returnType; - public final Expression body; - - public DecomposedExpression(TVar[] typeParameters, Variable[] parameters, - Type[] parameterTypes, Type effect, Type returnType, Expression body) { - super(); - if(SCLCompilerConfiguration.DEBUG) - if(effect == null) - throw new InternalCompilerError(); - this.typeParameters = typeParameters; - this.parameters = parameters; - this.parameterTypes = parameterTypes; - this.effect = effect; - this.returnType = returnType; - this.body = body; - } - - public static DecomposedExpression decompose(Expression expression) { - ArrayList typeParameterList = new ArrayList(); - ArrayList parameterList = new ArrayList(); - Type effect = Types.NO_EFFECTS; - while(true) { - if(expression instanceof ESimpleLambda) { - ESimpleLambda lambda = (ESimpleLambda)expression; - parameterList.add(lambda.parameter); - expression = lambda.value; - if(Types.canonical(effect) != Types.NO_EFFECTS) - throw new InternalCompilerError(); - effect = Types.simplifyFinalEffect(lambda.getLocalEffect()); - } - else if(expression instanceof ELambdaType) { - ELambdaType lambda = (ELambdaType)expression; - expression = lambda.value; - for(TVar parameter : lambda.parameters) - typeParameterList.add(parameter); - } - else - break; - } - - TVar[] typeParameters = typeParameterList.isEmpty() ? TVar.EMPTY_ARRAY : - typeParameterList.toArray(new TVar[typeParameterList.size()]); - Variable[] parameters = parameterList.toArray(new Variable[parameterList.size()]); - Type[] parameterTypes = Types.getTypes(parameters); - Type returnType = expression.getType(); - - return new DecomposedExpression( - typeParameters, parameters, - parameterTypes, effect, returnType, - expression); - } -} +package org.simantics.scl.compiler.internal.elaboration.decomposed; + +import java.util.ArrayList; + +import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; +import org.simantics.scl.compiler.elaboration.expressions.ELambdaType; +import org.simantics.scl.compiler.elaboration.expressions.ESimpleLambda; +import org.simantics.scl.compiler.elaboration.expressions.Expression; +import org.simantics.scl.compiler.elaboration.expressions.Variable; +import org.simantics.scl.compiler.errors.ErrorLog; +import org.simantics.scl.compiler.top.SCLCompilerConfiguration; +import org.simantics.scl.compiler.types.TVar; +import org.simantics.scl.compiler.types.Type; +import org.simantics.scl.compiler.types.Types; + +public class DecomposedExpression { + public final TVar[] typeParameters; + public final Variable[] parameters; + public final Type[] parameterTypes; + public final Type effect; + public final Type returnType; + public final Expression body; + + public DecomposedExpression(TVar[] typeParameters, Variable[] parameters, + Type[] parameterTypes, Type effect, Type returnType, Expression body) { + super(); + if(SCLCompilerConfiguration.DEBUG) + if(effect == null) + throw new InternalCompilerError(); + this.typeParameters = typeParameters; + this.parameters = parameters; + this.parameterTypes = parameterTypes; + this.effect = effect; + this.returnType = returnType; + this.body = body; + } + + public static DecomposedExpression decompose(ErrorLog errorLog, Expression expression) { + ArrayList typeParameterList = new ArrayList(); + ArrayList parameterList = new ArrayList(); + Type effect = Types.NO_EFFECTS; + while(true) { + if(expression instanceof ESimpleLambda) { + ESimpleLambda lambda = (ESimpleLambda)expression; + parameterList.add(lambda.parameter); + if(Types.canonical(effect) != Types.NO_EFFECTS) + errorLog.logWarning(expression.location, "Encountered nested lambdas where outermost lambda contains effects. The reason is probably in the subsumption solver and code should be OK."); + expression = lambda.value; + effect = Types.simplifyFinalEffect(lambda.getLocalEffect()); + } + else if(expression instanceof ELambdaType) { + ELambdaType lambda = (ELambdaType)expression; + expression = lambda.value; + for(TVar parameter : lambda.parameters) + typeParameterList.add(parameter); + } + else + break; + } + + TVar[] typeParameters = typeParameterList.isEmpty() ? TVar.EMPTY_ARRAY : + typeParameterList.toArray(new TVar[typeParameterList.size()]); + Variable[] parameters = parameterList.toArray(new Variable[parameterList.size()]); + Type[] parameterTypes = Types.getTypes(parameters); + Type returnType = expression.getType(); + + return new DecomposedExpression( + typeParameters, parameters, + parameterTypes, effect, returnType, + expression); + } +}