/******************************************************************************* * Copyright (c) 2005, 2016 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * *******************************************************************************/ package org.eclipse.dltk.ruby.typeinference; import java.util.List; import org.eclipse.dltk.ast.ASTNode; import org.eclipse.dltk.ruby.ast.RubyAssignment; /** * Stores local variable information: it's kind (argument, simple,...) and * evaluates all assignments to it relatively to given offset * * @author fourdman * */ public class LocalVariableInfo { public final static int KIND_DEFAULT = 0; public final static int KIND_BLOCK_ARG = 1; public final static int KIND_METHOD_ARG = 2; public final static int KIND_LOOP_VAR = 3; private ASTNode declaringScope; private RubyAssignment[] conditionalAssignments; private RubyAssignment lastAssignment; private int kind; public LocalVariableInfo(final ASTNode declaringScope, final RubyAssignment[] assignments, final RubyAssignment last) { this.declaringScope = declaringScope; this.conditionalAssignments = assignments; this.lastAssignment = last; this.kind = 0; } public LocalVariableInfo(final ASTNode declaringScope, final RubyAssignment[] assignments, final RubyAssignment last, int kind) { this.declaringScope = declaringScope; this.conditionalAssignments = assignments; lastAssignment = last; this.kind = kind; } public LocalVariableInfo() { } /** * Scoping node (if, for, while, block, method...), that encloses current * node * * @return */ public ASTNode getDeclaringScope() { return declaringScope; } /** * Assignments, that could be or not executed * * @return */ public RubyAssignment[] getConditionalAssignments() { if (conditionalAssignments == null) return new RubyAssignment[0]; return conditionalAssignments; } /** * Last assignment (could be null) to this variable, and which will be * performed in any way * * @return */ public RubyAssignment getLastAssignment() { return lastAssignment; } /** * Kind of variable: simple, method argument, block argument, for-loop * variable * * @return */ public int getKind() { return kind; } public void setDeclaringScope(ASTNode declaringScope) { this.declaringScope = declaringScope; } public void setConditionalAssignments( RubyAssignment[] conditionalAssignments) { this.conditionalAssignments = conditionalAssignments; } public void setConditionalAssignments(List<RubyAssignment> conditionalAssignments) { this.conditionalAssignments = conditionalAssignments .toArray(new RubyAssignment[conditionalAssignments.size()]); } public void setLastAssignment(RubyAssignment lastAssignment) { this.lastAssignment = lastAssignment; } public void setKind(int kind) { this.kind = kind; } }