internal virtual void visitMethod(MethodNode methodNode) { // First parameter is "this" for non-static methods int firstIndex = Modifier.isStatic(method.Modifiers) ? 0 : 1; Type[] parameterTypes = method.ParameterTypes; int numberParameters = System.Math.Min(parameterTypes.Length, methodNode.localVariables.size() - firstIndex); Dictionary <int, int> parameterIndices = new Dictionary <int, int>(); for (int i = 0, currentIndex = firstIndex; i < numberParameters; i++, currentIndex++) { parameterIndices[currentIndex] = i; if (parameterTypes[i] == typeof(long) || parameterTypes[i] == typeof(double)) { currentIndex++; } } parameters = new ParameterInfo[numberParameters]; for (int i = 0; i < methodNode.localVariables.size(); i++) { LocalVariableNode localVariableNode = (LocalVariableNode)methodNode.localVariables.get(i); if (parameterIndices.ContainsKey(localVariableNode.index)) { int parameterIndex = parameterIndices[localVariableNode.index]; parameters[parameterIndex] = new ParameterInfo(localVariableNode.name, parameterTypes[parameterIndex]); } } }
public void ParseMethodBody() { TypeBodyParser parser = new TypeBodyParser(); const string input = @" int GetValue(int someValue, System.Collections.Generic.Dictionary<int, UnityEngine.Vector3> dict) { var f; int localVar = 4; string str; return someValue; } "; TypeBodyNode astNode = parser.Parse(input, "", 0); Assert.AreEqual(1, astNode.nodes.size); MethodNode methodNode = (MethodNode)astNode.nodes[0]; Assert.AreEqual(4, methodNode.body.statements.size); Assert.IsInstanceOf <LocalVariableNode>(methodNode.body.statements[0]); Assert.IsInstanceOf <LocalVariableNode>(methodNode.body.statements[1]); Assert.IsInstanceOf <LocalVariableNode>(methodNode.body.statements[2]); Assert.IsInstanceOf <ReturnStatementNode>(methodNode.body.statements[3]); LocalVariableNode f = (LocalVariableNode)methodNode.body.statements[0]; LocalVariableNode localVar = (LocalVariableNode)methodNode.body.statements[1]; LocalVariableNode str = (LocalVariableNode)methodNode.body.statements[2]; ReturnStatementNode retn = (ReturnStatementNode)methodNode.body.statements[3]; Assert.AreEqual("f", f.name); Assert.AreEqual(default, f.typeLookup.typeName);
// private StatementNode StatementExpressionPrime(ref ExpressionNode left) // { // if (ConsumeOnMatch(TokenType.PAREN_OPEN)) // { // var args = ArgumentList(); // MatchExactly(TokenType.PAREN_CLOSE); // } // else if (MatchAny(increment_decrement_operators)) // { // IncrementDecrement(); // } // else // { // return null; // } // } private StatementNode LocalVariableDeclaration() { printDebug("Local Variable Declaration"); if (!MatchAny(this.types.Concat(new TokenType[] { TokenType.VAR_KEYWORD }).ToArray())) { ThrowSyntaxException("Type or Var expected"); } TypeDeclarationNode type = null; if (Match(TokenType.VAR_KEYWORD)) { var token = ConsumeToken(); type = TypeDetector(token.type, new IdentifierNode(token)); } else { type = Type(); } var variables = VariableDeclaratorList(null, null, type); var variablesNodes = new List <LocalVariableNode>(); foreach (var x in variables) { var y = new LocalVariableNode(x.type, x.identifier, x.assignment); variablesNodes.Add(y); } return(new LocalVariablesNode(variablesNodes)); }
public ForeachStatementNode(LocalVariableNode localVariable, ExpressionNode collection) { this.localVariable = localVariable; this.collection = collection; }