Exemplo n.º 1
0
    public void Parse_AliasInTernary()
    {
        ASTNode      root = ExpressionParser.Parse("$item.isInDirectControl ? '1' : '2'");
        OperatorNode node = AssertInstanceOfAndReturn <OperatorNode>(root);

        Assert.AreEqual(OperatorType.TernaryCondition, node.operatorType);
        MemberAccessExpressionNode left = AssertInstanceOfAndReturn <MemberAccessExpressionNode>(node.left);
    }
 protected override AssignmentState handleMemberAccess(MemberAccessExpressionNode memberAccess, HashSet <StatementNode> visited,
                                                       bool nested)
 {
     if (handleExpression(memberAccess.TargetObject, visited, true) == AssignmentState.Assigned)
     {
         return(AssignmentState.Assigned);
     }
     return(AssignmentState.NotAssigned);
 }
Exemplo n.º 3
0
        public override PapyrusType VisitMemberAccessExpression(MemberAccessExpressionNode node)
        {
            if (node == null)
            {
                return(null);
            }

            return(Visit(node.AccessExpression));
        }
Exemplo n.º 4
0
    public void Parse_InvokeAccessExpression_NoArgs()
    {
        ASTNode root = ExpressionParser.Parse("someProperty()");

        Assert.IsInstanceOf <MemberAccessExpressionNode>(root);
        MemberAccessExpressionNode node = (MemberAccessExpressionNode)root;

        Assert.AreEqual(1, node.parts.Count);
        Assert.IsInstanceOf <InvokeNode>(node.parts[0]);
    }
Exemplo n.º 5
0
    public void Parse_SafeAccessor_Dot()
    {
        ASTNode root = ExpressionParser.Parse("instance?.property");
        MemberAccessExpressionNode node = AssertInstanceOfAndReturn <MemberAccessExpressionNode>(root);

        Assert.AreEqual(1, node.parts.Count);
        Assert.AreEqual("instance", node.identifier);
        Assert.IsInstanceOf <DotAccessNode>(node.parts[0]);
        Assert.IsTrue(((DotAccessNode)node.parts[0]).isNullableAccess);
        Assert.AreEqual("property", ((DotAccessNode)node.parts[0]).propertyName);
    }
Exemplo n.º 6
0
    public void Parse_ArrayAccess_NestedArrayAccess()
    {
        ASTNode root = ExpressionParser.Parse("{rootContext[ rootContext[3] ]}");

        Assert.IsInstanceOf <MemberAccessExpressionNode>(root);
        MemberAccessExpressionNode node = (MemberAccessExpressionNode)root;

        Assert.AreEqual("rootContext", node.identifier);
        Assert.AreEqual(1, node.parts.Count);
        Assert.IsInstanceOf <IndexNode>(node.parts[0]);
        Assert.IsInstanceOf <MemberAccessExpressionNode>(((IndexNode)node.parts[0]).arguments[0]);
    }
Exemplo n.º 7
0
    public void Parse_DotAccessExpression_Multiple()
    {
        ASTNode root = ExpressionParser.Parse("someProperty.someValue.someOtherValue.evenMore");

        Assert.IsInstanceOf <MemberAccessExpressionNode>(root);
        MemberAccessExpressionNode node = (MemberAccessExpressionNode)root;

        Assert.AreEqual(3, node.parts.Count);
        Assert.AreEqual("someProperty", node.identifier);
        Assert.AreEqual("someValue", ((DotAccessNode)node.parts[0]).propertyName);
        Assert.AreEqual("someOtherValue", ((DotAccessNode)node.parts[1]).propertyName);
        Assert.AreEqual("evenMore", ((DotAccessNode)node.parts[2]).propertyName);
    }
Exemplo n.º 8
0
    public void Parse_DotAccessExpression()
    {
        ASTNode root = ExpressionParser.Parse("someProperty.someValue");

        Assert.IsInstanceOf <MemberAccessExpressionNode>(root);
        MemberAccessExpressionNode node = (MemberAccessExpressionNode)root;

        Assert.AreEqual(1, node.parts.Count);
        DotAccessNode dotNode = node.parts[0] as DotAccessNode;

        Assert.AreEqual("someValue", dotNode.propertyName);
        Assert.AreEqual("someProperty", node.identifier);
    }
Exemplo n.º 9
0
    public void Parse_PropertyAccessMixedArrayAccessWithInvoke()
    {
        ASTNode root = ExpressionParser.Parse("{rootContext()[1].property1.property2}");

        Assert.IsInstanceOf <MemberAccessExpressionNode>(root);
        MemberAccessExpressionNode node = (MemberAccessExpressionNode)root;

        Assert.AreEqual("rootContext", node.identifier);
        Assert.AreEqual(4, node.parts.Count);
        Assert.IsInstanceOf <InvokeNode>(node.parts[0]);
        Assert.IsInstanceOf <IndexNode>(node.parts[1]);
        Assert.IsInstanceOf <DotAccessNode>(node.parts[2]);
        Assert.IsInstanceOf <DotAccessNode>(node.parts[3]);
    }
Exemplo n.º 10
0
    public void Parse_SafeAccessor_Index()
    {
        ASTNode root = ExpressionParser.Parse("instance?[1]");
        MemberAccessExpressionNode node = AssertInstanceOfAndReturn <MemberAccessExpressionNode>(root);

        Assert.AreEqual(1, node.parts.Count);
        Assert.AreEqual("instance", node.identifier);
        Assert.IsInstanceOf <IndexNode>(node.parts[0]);
        IndexNode indexNode = (IndexNode)node.parts[0];

        Assert.IsTrue(indexNode.isNullableAccess);
        Assert.AreEqual(1, indexNode.arguments.Count);
        Assert.IsInstanceOf <LiteralNode>(indexNode.arguments[0]);
    }
Exemplo n.º 11
0
    public void Parse_InvokeAccessExpression_1Arg()
    {
        ASTNode root = ExpressionParser.Parse("someProperty(1)");

        Assert.IsInstanceOf <MemberAccessExpressionNode>(root);
        MemberAccessExpressionNode node = (MemberAccessExpressionNode)root;

        Assert.AreEqual(1, node.parts.Count);
        Assert.IsInstanceOf <InvokeNode>(node.parts[0]);
        InvokeNode invokeNode = (InvokeNode)node.parts[0];

        Assert.AreEqual(1, invokeNode.parameters.Count);
        Assert.IsInstanceOf <LiteralNode>(invokeNode.parameters[0]);
    }
Exemplo n.º 12
0
    public void Parse_TypePathExpression_WithGenerics()
    {
        ASTNode root = ExpressionParser.Parse("System.Collections.Generic.List<System.Tuple<int, System.Collections.Generic.List<string>>>.Value");
        MemberAccessExpressionNode node = AssertInstanceOfAndReturn <MemberAccessExpressionNode>(root);
        var t = typeof(System.Collections.Generic.List <System.Tuple <int, System.Collections.Generic.List <string> > >);

        Assert.AreEqual("System", node.identifier);
        Assert.AreEqual("Collections", AssertInstanceOfAndReturn <DotAccessNode>(node.parts[0]).propertyName);
        Assert.AreEqual("Generic", AssertInstanceOfAndReturn <DotAccessNode>(node.parts[1]).propertyName);
        Assert.AreEqual("List", AssertInstanceOfAndReturn <DotAccessNode>(node.parts[2]).propertyName);
        GenericTypePathNode typeNode = AssertInstanceOfAndReturn <GenericTypePathNode>(node.parts[3]);

        Assert.AreEqual(1, typeNode.genericPath.generics.Count);
        Assert.AreEqual(typeof(Tuple <int, System.Collections.Generic.List <string> >), TypeProcessor.ResolveType(typeNode.genericPath.generics[0]));
    }
Exemplo n.º 13
0
    public void Parse_Ternary_WithParenExpression()
    {
        ASTNode      root         = ExpressionParser.Parse("thing != null ? data.ToString() : 'Anything'}");
        OperatorNode outerTernary = AssertOpNode(root, OperatorType.TernaryCondition);

        OperatorNode outerCondition = AssertOpNode(outerTernary.left, OperatorType.NotEquals);
        OperatorNode outerSelection = AssertOpNode(outerTernary.right, OperatorType.TernarySelection);

        Assert.AreEqual("thing", AssertInstanceOfAndReturn <IdentifierNode>(outerCondition.left).name);
        Assert.AreEqual("null", AssertInstanceOfAndReturn <LiteralNode>(outerCondition.right).rawValue);

        MemberAccessExpressionNode access = AssertInstanceOfAndReturn <MemberAccessExpressionNode>(outerSelection.left);
        LiteralNode anything = AssertInstanceOfAndReturn <LiteralNode>(outerSelection.right);

        Assert.AreEqual(anything.rawValue, "Anything");
    }
Exemplo n.º 14
0
    public void Parse_InvokeAccessExpression_2Arg_Chained()
    {
        ASTNode root = ExpressionParser.Parse("someProperty(1, something)()");

        Assert.IsInstanceOf <MemberAccessExpressionNode>(root);
        MemberAccessExpressionNode node = (MemberAccessExpressionNode)root;

        Assert.AreEqual(2, node.parts.Count);
        Assert.IsInstanceOf <InvokeNode>(node.parts[0]);
        Assert.IsInstanceOf <InvokeNode>(node.parts[1]);
        InvokeNode invokeNode = (InvokeNode)node.parts[0];

        Assert.AreEqual(2, invokeNode.parameters.Count);
        Assert.IsInstanceOf <LiteralNode>(invokeNode.parameters[0]);
        Assert.IsInstanceOf <IdentifierNode>(invokeNode.parameters[1]);
    }
Exemplo n.º 15
0
            protected override Void handleMemberAccess(MemberAccessExpressionNode memberAccess, Set <TypeInfo> dependencies, bool nested)
            {
                var info   = memberAccess.getUserData(typeof(ExpressionInfo));
                var member = info.getMember();

                handleExpression(memberAccess.TargetObject, dependencies, nested);
                if (member == null)
                {
                    var type = info.Type;
                    if (type != null)
                    {
                        addDependencies(type, dependencies);
                    }
                }
                return(null);
            }
Exemplo n.º 16
0
    public void Parse_ArrayAccess_RootContext_LiteralExpression()
    {
        ASTNode root = ExpressionParser.Parse("{rootContext[ 1 + 1 ]}");

        Assert.IsInstanceOf <MemberAccessExpressionNode>(root);
        MemberAccessExpressionNode node = (MemberAccessExpressionNode)root;

        Assert.AreEqual("rootContext", node.identifier);
        Assert.AreEqual(1, node.parts.Count);
        Assert.IsInstanceOf <IndexNode>(node.parts[0]);
        Assert.IsInstanceOf <OperatorNode>(((IndexNode)node.parts[0]).arguments[0]);
        OperatorNode opNode = (OperatorNode)((IndexNode)node.parts[0]).arguments[0];

        Assert.AreEqual(OperatorType.Plus, opNode.operatorType);
        Assert.IsInstanceOf <LiteralNode>(opNode.left);
        Assert.IsInstanceOf <LiteralNode>(opNode.right);
    }
Exemplo n.º 17
0
        public static IEnumerable <PapyrusSymbol> GetReferencableSymbolsForMemberAccess(this MemberAccessExpressionNode memberAccessExpression)
        {
            var baseExpression   = memberAccessExpression.BaseExpression;
            var accessExpression = memberAccessExpression.AccessExpression;

            var baseType = baseExpression.GetTypeOfExpression();

            if (baseType is ComplexType asComplexType)
            {
                var functionCall = accessExpression?.GetDescendants(true).OfType <FunctionCallExpressionNode>().FirstOrDefault();
                var isGlobalCall = functionCall != null && functionCall.IsGlobalCall;

                // TODO: Unsure if this still needs to be done.
                // If the accessExpression is null (we're at '.' without any identifier), we need to fall back to inferring whether
                // or not this is a global call by looking at the base expression.
                // If it is an identifier expression that resolves to a script type, then we know the member symbols are global only.
                if (accessExpression == null && baseExpression is IdentifierExpressionNode accessAsIdentifier)
                {
                    var referencedSymbol = accessAsIdentifier.Identifier.GetDeclaredOrReferencedSymbol();
                    if (referencedSymbol != null)
                    {
                        isGlobalCall = referencedSymbol.Kind == SymbolKinds.Script;
                    }
                }

                var typeSymbol = asComplexType.Symbol;
                if (typeSymbol is ScriptSymbol asScriptSymbol)
                {
                    var memberSymbols = asScriptSymbol.GetScriptMemberSymbols(
                        globalOnly: isGlobalCall,
                        declaredOnly: asScriptSymbol.SyntheticArrayType != null,
                        additionalNonGlobalKinds: memberAccessExpression.Parent is FunctionHeaderNode ? SymbolKinds.Event | SymbolKinds.CustomEvent : SymbolKinds.None);

                    if (memberAccessExpression.Parent is FunctionHeaderNode)
                    {
                        return(memberSymbols.Where(s => (s.Kind & SymbolKinds.Event) != 0 || (s.Kind & SymbolKinds.CustomEvent) != 0));
                    }

                    if (!isGlobalCall)
                    {
                        if (baseExpression.IsSelfIdentifierExpression())
                        {
                            return(memberSymbols.Where(s => (s.Kind & SymbolKinds.Function) != 0 || (s.Kind & SymbolKinds.Event) != 0 || (s.Kind & SymbolKinds.Property) != 0));
                        }

                        if (baseExpression.IsParentIdentifierExpression())
                        {
                            return(memberSymbols.Where(s => (s.Kind & SymbolKinds.Function) != 0 || (s.Kind & SymbolKinds.Event) != 0));
                        }
                    }

                    return(memberSymbols);
                }

#if FALLOUT4
                if (typeSymbol is StructSymbol asStructSymbol)
                {
                    return(asStructSymbol.Children);
                }
#endif
            }

            return(Enumerable.Empty <PapyrusSymbol>());
        }