Search in sources :

Example 1 with DelegatedScope

use of org.eclipse.ceylon.langtools.tools.javac.code.Scope.DelegatedScope in project ceylon by eclipse.

the class Attr method visitLetExpr.

/* Added for Ceylon, required by the ExpressionTransformer */
@Override
public void visitLetExpr(LetExpr tree) {
    Scope scope;
    if (env.info.scope.owner.kind == Kinds.VAR) {
        // for field initialisers we must access the parent scope, otherwise we get
        // a DelegateScope which doesn't allow us to declare new variables
        scope = env.info.scope.next;
    } else
        scope = env.info.scope;
    if (scope instanceof DelegatedScope) {
        throw new AssertionError("Broken use of LetExpr");
    }
    // make a new environment which captures the current one
    Env<AttrContext> localEnv = env.dup(tree, env.info.dup(scope.dup()));
    // Field initialisers have not been entered yet, so we need to do it now:
    if (localEnv.info.scope.owner.kind == Kinds.TYP) {
        memberEnter.memberEnter(tree, localEnv);
        annotate.flush();
    }
    // find the lint
    Env<AttrContext> lintEnv = env;
    while (lintEnv.info.lint == null) lintEnv = lintEnv.next;
    // Having found the enclosing lint value, we can initialize the lint value for this let
    localEnv.info.lint = lintEnv.info.lint;
    Lint prevLint = chk.setLint(env.info.lint);
    try {
        // do statements if we have any
        if (tree.stats != null) {
            if (sourceLanguage.isCeylon())
                completeLocalTypes(tree.stats, localEnv);
            attribStats(tree.stats, localEnv);
        }
        // now attribute the expression with the LET expected type (pt)
        attribExpr(tree.expr, localEnv, pt());
        // the type of the LET is the type of the expression
        tree.type = tree.expr.type;
        // same code in TransTypes.visit(LetExpr)
        if (tree.type.constValue() != null && tree.stats != null && !tree.stats.isEmpty())
            tree.type = tree.type.baseType();
        result = tree.type;
    } finally {
        // exit the LET scope
        localEnv.info.scope.leave();
        // restore the previous lint
        chk.setLint(prevLint);
    }
}
Also used : DelegatedScope(org.eclipse.ceylon.langtools.tools.javac.code.Scope.DelegatedScope) DelegatedScope(org.eclipse.ceylon.langtools.tools.javac.code.Scope.DelegatedScope)

Aggregations

DelegatedScope (org.eclipse.ceylon.langtools.tools.javac.code.Scope.DelegatedScope)1