Search in sources :

Example 6 with ForStatement

use of org.eclipse.n4js.n4JS.ForStatement in project n4js by eclipse.

the class GuardStructureFactory method getCondition.

/**
 * @return the top {@link Expression} of a {@link GuardStructure}, or null.
 */
private static Expression getCondition(ControlFlowEdge edge) {
    Expression condition = null;
    Node previousNode = edge.start;
    ControlFlowElement previousCFE = previousNode.getControlFlowElement();
    if (previousCFE instanceof ConditionalExpression) {
        ConditionalExpression ce = (ConditionalExpression) previousCFE;
        condition = ce.getExpression();
    } else if (previousCFE instanceof BinaryLogicalExpression) {
        BinaryLogicalExpression ble = (BinaryLogicalExpression) previousCFE;
        condition = ble.getLhs();
    } else if (previousCFE instanceof IfStatement) {
        IfStatement is = (IfStatement) previousCFE;
        condition = is.getExpression();
    } else if (previousCFE instanceof WhileStatement) {
        WhileStatement ws = (WhileStatement) previousCFE;
        condition = ws.getExpression();
    } else if (previousCFE instanceof DoStatement) {
        DoStatement ws = (DoStatement) previousCFE;
        condition = ws.getExpression();
    } else if (previousCFE instanceof ForStatement) {
        ForStatement ws = (ForStatement) previousCFE;
        condition = ws.getExpression();
    }
    return condition;
}
Also used : IfStatement(org.eclipse.n4js.n4JS.IfStatement) BinaryLogicalExpression(org.eclipse.n4js.n4JS.BinaryLogicalExpression) DoStatement(org.eclipse.n4js.n4JS.DoStatement) BinaryLogicalExpression(org.eclipse.n4js.n4JS.BinaryLogicalExpression) Expression(org.eclipse.n4js.n4JS.Expression) ConditionalExpression(org.eclipse.n4js.n4JS.ConditionalExpression) Node(org.eclipse.n4js.flowgraphs.model.Node) ConditionalExpression(org.eclipse.n4js.n4JS.ConditionalExpression) WhileStatement(org.eclipse.n4js.n4JS.WhileStatement) ForStatement(org.eclipse.n4js.n4JS.ForStatement) ControlFlowElement(org.eclipse.n4js.n4JS.ControlFlowElement)

Example 7 with ForStatement

use of org.eclipse.n4js.n4JS.ForStatement in project n4js by eclipse.

the class NullUndefinedValidator method isWriteAccess.

private boolean isWriteAccess(EObject reference) {
    EObject parent = reference.eContainer();
    if (parent == null) {
        return false;
    }
    if (parent instanceof AssignmentExpression) {
        AssignmentExpression ae = (AssignmentExpression) parent;
        return ae.getLhs() == reference;
    }
    if (parent instanceof ForStatement) {
        ForStatement fs = (ForStatement) parent;
        return fs.getInitExpr() == reference;
    }
    DestructNode dNode = DestructureUtils.getCorrespondingDestructNode(reference);
    if (dNode != null) {
        dNode = dNode.findNodeForElement(parent);
        return dNode != null;
    }
    return false;
}
Also used : AssignmentExpression(org.eclipse.n4js.n4JS.AssignmentExpression) EObject(org.eclipse.emf.ecore.EObject) DestructNode(org.eclipse.n4js.n4JS.DestructNode) ForStatement(org.eclipse.n4js.n4JS.ForStatement)

Example 8 with ForStatement

use of org.eclipse.n4js.n4JS.ForStatement in project n4js by eclipse.

the class InternalTypeSystem method applyRuleTypeVariableDeclaration.

protected Result<TypeRef> applyRuleTypeVariableDeclaration(final RuleEnvironment G, final RuleApplicationTrace _trace_, final VariableDeclaration vdecl) throws RuleFailedException {
    // output parameter
    TypeRef T = null;
    TypeRef _declaredTypeRef = vdecl.getDeclaredTypeRef();
    boolean _tripleNotEquals = (_declaredTypeRef != null);
    if (_tripleNotEquals) {
        T = vdecl.getDeclaredTypeRef();
    } else {
        EObject _eContainer = vdecl.eContainer();
        if ((_eContainer instanceof BindingElement)) {
            Expression _expression = vdecl.getExpression();
            Pair<String, Expression> _mappedTo = Pair.<String, Expression>of(RuleEnvironmentExtensions.GUARD_VARIABLE_DECLARATION, _expression);
            Object _get = G.get(_mappedTo);
            boolean _tripleEquals = (_get == null);
            if (_tripleEquals) {
                final RuleEnvironment G2 = RuleEnvironmentExtensions.wrap(G);
                Expression _expression_1 = vdecl.getExpression();
                Pair<String, Expression> _mappedTo_1 = Pair.<String, Expression>of(RuleEnvironmentExtensions.GUARD_VARIABLE_DECLARATION, _expression_1);
                boolean _add = G2.add(_mappedTo_1, Boolean.TRUE);
                /* G2.add(GUARD_VARIABLE_DECLARATION->vdecl.expression,Boolean.TRUE) */
                if (!_add) {
                    sneakyThrowRuleFailedException("G2.add(GUARD_VARIABLE_DECLARATION->vdecl.expression,Boolean.TRUE)");
                }
                TypeRef _elvis = null;
                TypeRef _typeOfVariableDeclarationInDestructuringPattern = this.destructureHelper.getTypeOfVariableDeclarationInDestructuringPattern(G2, vdecl);
                if (_typeOfVariableDeclarationInDestructuringPattern != null) {
                    _elvis = _typeOfVariableDeclarationInDestructuringPattern;
                } else {
                    ParameterizedTypeRef _anyTypeRef = RuleEnvironmentExtensions.anyTypeRef(G);
                    _elvis = _anyTypeRef;
                }
                T = _elvis;
            } else {
                T = RuleEnvironmentExtensions.anyTypeRef(G);
            }
        } else {
            if (((vdecl.eContainer() instanceof ForStatement) && ((ForStatement) vdecl.eContainer()).isForOf())) {
                EObject _eContainer_1 = vdecl.eContainer();
                final ForStatement forOfStmnt = ((ForStatement) _eContainer_1);
                EObject _eContainer_2 = vdecl.eContainer();
                Pair<String, EObject> _mappedTo_2 = Pair.<String, EObject>of(RuleEnvironmentExtensions.GUARD_VARIABLE_DECLARATION, _eContainer_2);
                Object _get_1 = G.get(_mappedTo_2);
                boolean _tripleEquals_1 = (_get_1 == null);
                if (_tripleEquals_1) {
                    final RuleEnvironment G2_1 = RuleEnvironmentExtensions.wrap(G);
                    EObject _eContainer_3 = vdecl.eContainer();
                    Pair<String, EObject> _mappedTo_3 = Pair.<String, EObject>of(RuleEnvironmentExtensions.GUARD_VARIABLE_DECLARATION, _eContainer_3);
                    boolean _add_1 = G2_1.add(_mappedTo_3, Boolean.TRUE);
                    /* G2.add(GUARD_VARIABLE_DECLARATION->vdecl.eContainer,Boolean.TRUE) */
                    if (!_add_1) {
                        sneakyThrowRuleFailedException("G2.add(GUARD_VARIABLE_DECLARATION->vdecl.eContainer,Boolean.TRUE)");
                    }
                    /* { G2 |- forOfStmnt.expression : var TypeRef ofPartTypeRef val elemType = destructureHelper.extractIterableElementType(G2, ofPartTypeRef) elemType!==null G2 |~ elemType /\ T } or { T = TypeRefsFactory.eINSTANCE.createUnknownTypeRef } */
                    {
                        RuleFailedException previousFailure = null;
                        try {
                            /* G2 |- forOfStmnt.expression : var TypeRef ofPartTypeRef */
                            Expression _expression_2 = forOfStmnt.getExpression();
                            TypeRef ofPartTypeRef = null;
                            Result<TypeRef> result = typeInternal(G2_1, _trace_, _expression_2);
                            checkAssignableTo(result.getFirst(), TypeRef.class);
                            ofPartTypeRef = (TypeRef) result.getFirst();
                            final TypeArgument elemType = this.destructureHelper.extractIterableElementType(G2_1, ofPartTypeRef);
                            /* elemType!==null */
                            if (!(elemType != null)) {
                                sneakyThrowRuleFailedException("elemType!==null");
                            }
                            /* G2 |~ elemType /\ T */
                            Result<TypeRef> result_1 = upperBoundInternal(G2_1, _trace_, elemType);
                            checkAssignableTo(result_1.getFirst(), TypeRef.class);
                            T = (TypeRef) result_1.getFirst();
                        } catch (Exception e) {
                            previousFailure = extractRuleFailedException(e);
                            T = TypeRefsFactory.eINSTANCE.createUnknownTypeRef();
                        }
                    }
                } else {
                    T = RuleEnvironmentExtensions.anyTypeRef(G);
                }
            } else {
                if (((vdecl.eContainer() instanceof ForStatement) && ((ForStatement) vdecl.eContainer()).isForIn())) {
                    T = RuleEnvironmentExtensions.stringTypeRef(G);
                } else {
                    Expression _expression_3 = vdecl.getExpression();
                    boolean _tripleNotEquals_1 = (_expression_3 != null);
                    if (_tripleNotEquals_1) {
                        Expression _expression_4 = vdecl.getExpression();
                        Pair<String, Expression> _mappedTo_4 = Pair.<String, Expression>of(RuleEnvironmentExtensions.GUARD_VARIABLE_DECLARATION, _expression_4);
                        Object _get_2 = G.get(_mappedTo_4);
                        boolean _tripleEquals_2 = (_get_2 == null);
                        if (_tripleEquals_2) {
                            final RuleEnvironment G2_2 = RuleEnvironmentExtensions.wrap(G);
                            Expression _expression_5 = vdecl.getExpression();
                            Pair<String, Expression> _mappedTo_5 = Pair.<String, Expression>of(RuleEnvironmentExtensions.GUARD_VARIABLE_DECLARATION, _expression_5);
                            boolean _add_2 = G2_2.add(_mappedTo_5, Boolean.TRUE);
                            /* G2.add(GUARD_VARIABLE_DECLARATION->vdecl.expression,Boolean.TRUE) */
                            if (!_add_2) {
                                sneakyThrowRuleFailedException("G2.add(GUARD_VARIABLE_DECLARATION->vdecl.expression,Boolean.TRUE)");
                            }
                            /* G2 |- vdecl.expression: var TypeRef E */
                            Expression _expression_6 = vdecl.getExpression();
                            TypeRef E = null;
                            Result<TypeRef> result_2 = typeInternal(G2_2, _trace_, _expression_6);
                            checkAssignableTo(result_2.getFirst(), TypeRef.class);
                            E = (TypeRef) result_2.getFirst();
                            if (((E instanceof BoundThisTypeRef) || ((E instanceof TypeTypeRef) && (((TypeTypeRef) E).getTypeArg() instanceof BoundThisTypeRef)))) {
                            } else {
                                /* G2 |~ E /\ E */
                                Result<TypeRef> result_3 = upperBoundInternal(G2_2, _trace_, E);
                                checkAssignableTo(result_3.getFirst(), TypeRef.class);
                                E = (TypeRef) result_3.getFirst();
                            }
                            if ((((E.getDeclaredType() == RuleEnvironmentExtensions.undefinedType(G)) || (E.getDeclaredType() == RuleEnvironmentExtensions.nullType(G))) || (E.getDeclaredType() == RuleEnvironmentExtensions.voidType(G)))) {
                                T = RuleEnvironmentExtensions.anyTypeRef(G);
                            } else {
                                T = E;
                            }
                        } else {
                            T = RuleEnvironmentExtensions.anyTypeRef(G);
                        }
                    } else {
                        T = RuleEnvironmentExtensions.anyTypeRef(G);
                    }
                }
            }
        }
    }
    boolean _enforceDynamicTypes = this.jsVariantHelper.enforceDynamicTypes(vdecl);
    if (_enforceDynamicTypes) {
        T = this.typeSystemHelper.makeDynamic(T);
    }
    return new Result<TypeRef>(T);
}
Also used : BindingElement(org.eclipse.n4js.n4JS.BindingElement) ThisTypeRef(org.eclipse.n4js.ts.typeRefs.ThisTypeRef) ParameterizedTypeRef(org.eclipse.n4js.ts.typeRefs.ParameterizedTypeRef) BaseTypeRef(org.eclipse.n4js.ts.typeRefs.BaseTypeRef) FunctionTypeRef(org.eclipse.n4js.ts.typeRefs.FunctionTypeRef) ExistentialTypeRef(org.eclipse.n4js.ts.typeRefs.ExistentialTypeRef) BoundThisTypeRef(org.eclipse.n4js.ts.typeRefs.BoundThisTypeRef) StructuralTypeRef(org.eclipse.n4js.ts.typeRefs.StructuralTypeRef) TypeRef(org.eclipse.n4js.ts.typeRefs.TypeRef) TypeTypeRef(org.eclipse.n4js.ts.typeRefs.TypeTypeRef) StaticBaseTypeRef(org.eclipse.n4js.ts.typeRefs.StaticBaseTypeRef) ComposedTypeRef(org.eclipse.n4js.ts.typeRefs.ComposedTypeRef) UnknownTypeRef(org.eclipse.n4js.ts.typeRefs.UnknownTypeRef) TypeArgument(org.eclipse.n4js.ts.typeRefs.TypeArgument) TaggedTemplateString(org.eclipse.n4js.n4JS.TaggedTemplateString) RuleFailedException(org.eclipse.xsemantics.runtime.RuleFailedException) RuleFailedException(org.eclipse.xsemantics.runtime.RuleFailedException) Result(org.eclipse.xsemantics.runtime.Result) StructuralTypingResult(org.eclipse.n4js.typesystem.StructuralTypingResult) ParameterizedTypeRef(org.eclipse.n4js.ts.typeRefs.ParameterizedTypeRef) BinaryBitwiseExpression(org.eclipse.n4js.n4JS.BinaryBitwiseExpression) AssignmentExpression(org.eclipse.n4js.n4JS.AssignmentExpression) IndexedAccessExpression(org.eclipse.n4js.n4JS.IndexedAccessExpression) UnionTypeExpression(org.eclipse.n4js.ts.typeRefs.UnionTypeExpression) FunctionExpression(org.eclipse.n4js.n4JS.FunctionExpression) PromisifyExpression(org.eclipse.n4js.n4JS.PromisifyExpression) UnaryExpression(org.eclipse.n4js.n4JS.UnaryExpression) ParenExpression(org.eclipse.n4js.n4JS.ParenExpression) ParameterizedCallExpression(org.eclipse.n4js.n4JS.ParameterizedCallExpression) AdditiveExpression(org.eclipse.n4js.n4JS.AdditiveExpression) PostfixExpression(org.eclipse.n4js.n4JS.PostfixExpression) YieldExpression(org.eclipse.n4js.n4JS.YieldExpression) ConditionalExpression(org.eclipse.n4js.n4JS.ConditionalExpression) FunctionTypeExpression(org.eclipse.n4js.ts.typeRefs.FunctionTypeExpression) RelationalExpression(org.eclipse.n4js.n4JS.RelationalExpression) NewExpression(org.eclipse.n4js.n4JS.NewExpression) IntersectionTypeExpression(org.eclipse.n4js.ts.typeRefs.IntersectionTypeExpression) AwaitExpression(org.eclipse.n4js.n4JS.AwaitExpression) CommaExpression(org.eclipse.n4js.n4JS.CommaExpression) Expression(org.eclipse.n4js.n4JS.Expression) CastExpression(org.eclipse.n4js.n4JS.CastExpression) BinaryLogicalExpression(org.eclipse.n4js.n4JS.BinaryLogicalExpression) EqualityExpression(org.eclipse.n4js.n4JS.EqualityExpression) ShiftExpression(org.eclipse.n4js.n4JS.ShiftExpression) ParameterizedPropertyAccessExpression(org.eclipse.n4js.n4JS.ParameterizedPropertyAccessExpression) MultiplicativeExpression(org.eclipse.n4js.n4JS.MultiplicativeExpression) N4ClassExpression(org.eclipse.n4js.n4JS.N4ClassExpression) EObject(org.eclipse.emf.ecore.EObject) BoundThisTypeRef(org.eclipse.n4js.ts.typeRefs.BoundThisTypeRef) TypeTypeRef(org.eclipse.n4js.ts.typeRefs.TypeTypeRef) EObject(org.eclipse.emf.ecore.EObject) RuleEnvironment(org.eclipse.xsemantics.runtime.RuleEnvironment) ForStatement(org.eclipse.n4js.n4JS.ForStatement)

Aggregations

ForStatement (org.eclipse.n4js.n4JS.ForStatement)8 BinaryLogicalExpression (org.eclipse.n4js.n4JS.BinaryLogicalExpression)7 ConditionalExpression (org.eclipse.n4js.n4JS.ConditionalExpression)7 EObject (org.eclipse.emf.ecore.EObject)6 AssignmentExpression (org.eclipse.n4js.n4JS.AssignmentExpression)6 Expression (org.eclipse.n4js.n4JS.Expression)5 ArrayElement (org.eclipse.n4js.n4JS.ArrayElement)3 ArrayLiteral (org.eclipse.n4js.n4JS.ArrayLiteral)3 DestructNode (org.eclipse.n4js.n4JS.DestructNode)3 DoStatement (org.eclipse.n4js.n4JS.DoStatement)3 IfStatement (org.eclipse.n4js.n4JS.IfStatement)3 ParenExpression (org.eclipse.n4js.n4JS.ParenExpression)3 WhileStatement (org.eclipse.n4js.n4JS.WhileStatement)3 AdditiveExpression (org.eclipse.n4js.n4JS.AdditiveExpression)2 AwaitExpression (org.eclipse.n4js.n4JS.AwaitExpression)2 BinaryBitwiseExpression (org.eclipse.n4js.n4JS.BinaryBitwiseExpression)2 BindingElement (org.eclipse.n4js.n4JS.BindingElement)2 CastExpression (org.eclipse.n4js.n4JS.CastExpression)2 CommaExpression (org.eclipse.n4js.n4JS.CommaExpression)2 EqualityExpression (org.eclipse.n4js.n4JS.EqualityExpression)2