/******************************************************************************* * 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.core.tests.typeinference.utils; import org.eclipse.core.resources.IncrementalProjectBuilder; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.dltk.ast.declarations.MethodDeclaration; import org.eclipse.dltk.ast.declarations.ModuleDeclaration; import org.eclipse.dltk.ast.declarations.TypeDeclaration; import org.eclipse.dltk.ruby.core.tests.typeinference.AbstractTypeInferencingTests; import org.eclipse.dltk.ruby.internal.parsers.jruby.ASTUtils; import org.eclipse.dltk.ruby.typeinference.LocalVariableInfo; import org.eclipse.dltk.ruby.typeinference.RubyTypeInferencingUtils; public class LocalVariablesInspectionTest extends AbstractTypeInferencingTests { private static final String PATH_PREFIX = "/workspace/typeinference2/localvars/"; private static final String SRC_PROJECT = "typeinference2"; public LocalVariablesInspectionTest(String name) { super("org.eclipse.dltk.ruby.core.tests", name); } @Override public void setUpSuite() throws Exception { PROJECT = setUpScriptProject(SRC_PROJECT); super.setUpSuite(); waitUntilIndexesReady(); ResourcesPlugin.getWorkspace().build(IncrementalProjectBuilder.FULL_BUILD, new NullProgressMonitor()); } @Override public void tearDownSuite() throws Exception { deleteProject(SRC_PROJECT); super.tearDownSuite(); } public void testGlobalExistant() throws Exception { String content = loadContent(PATH_PREFIX + "simple1.rb"); ModuleDeclaration ast = ASTUtils.getAST(content.toCharArray()); int offset = content.indexOf("puts") + 1; LocalVariableInfo info = RubyTypeInferencingUtils.inspectLocalVariable(ast, offset, "x"); assertEquals(0, info.getKind()); assertNotNull(info.getLastAssignment()); assertEquals(0, info.getConditionalAssignments().length); } public void testGlobalExistant2() throws Exception { String content = loadContent(PATH_PREFIX + "simple1.rb"); ModuleDeclaration ast = ASTUtils.getAST(content.toCharArray()); int offset = content.indexOf("puts y") + 1; LocalVariableInfo info = RubyTypeInferencingUtils.inspectLocalVariable(ast, offset, "y"); assertEquals(0, info.getKind()); assertNotNull(info.getLastAssignment()); assertEquals(0, info.getConditionalAssignments().length); } public void testGlobalNotExistant() throws Exception { String content = loadContent(PATH_PREFIX + "simple1.rb"); ModuleDeclaration ast = ASTUtils.getAST(content.toCharArray()); int offset = content.indexOf("puts") + 1; LocalVariableInfo info = RubyTypeInferencingUtils.inspectLocalVariable(ast, offset, "y"); assertEquals(0, info.getKind()); assertNull(info.getLastAssignment()); assertEquals(0, info.getConditionalAssignments().length); } public void testGlobalConditional1() throws Exception { String content = loadContent(PATH_PREFIX + "conditional1.rb"); ModuleDeclaration ast = ASTUtils.getAST(content.toCharArray()); int offset = content.indexOf("puts") + 1; LocalVariableInfo info = RubyTypeInferencingUtils.inspectLocalVariable(ast, offset, "x"); assertEquals(0, info.getKind()); assertNull(info.getLastAssignment()); assertEquals(2, info.getConditionalAssignments().length); } public void testGlobalConditional2() throws Exception { String content = loadContent(PATH_PREFIX + "conditional2.rb"); ModuleDeclaration ast = ASTUtils.getAST(content.toCharArray()); int offset = content.indexOf("puts") + 1; LocalVariableInfo info = RubyTypeInferencingUtils.inspectLocalVariable(ast, offset, "x"); assertEquals(0, info.getKind()); assertNotNull(info.getLastAssignment()); assertEquals(2, info.getConditionalAssignments().length); } public void testGlobalConditional3() throws Exception { String content = loadContent(PATH_PREFIX + "conditional3.rb"); ModuleDeclaration ast = ASTUtils.getAST(content.toCharArray()); int offset = content.indexOf("puts") + 1; LocalVariableInfo info = RubyTypeInferencingUtils.inspectLocalVariable(ast, offset, "x"); assertEquals(0, info.getKind()); assertNotNull(info.getLastAssignment()); assertEquals(0, info.getConditionalAssignments().length); } public void testGlobalConditional4() throws Exception { String content = loadContent(PATH_PREFIX + "conditional4.rb"); ModuleDeclaration ast = ASTUtils.getAST(content.toCharArray()); int offset = content.indexOf("bye") + 1; LocalVariableInfo info = RubyTypeInferencingUtils.inspectLocalVariable(ast, offset, "x"); assertEquals(0, info.getKind()); assertNotNull(info.getLastAssignment()); assertEquals(1, info.getConditionalAssignments().length); } public void testInsideMethod1() throws Exception { String content = loadContent(PATH_PREFIX + "method1.rb"); ModuleDeclaration ast = ASTUtils.getAST(content.toCharArray()); int offset = content.indexOf("puts") + 1; LocalVariableInfo info = RubyTypeInferencingUtils.inspectLocalVariable(ast, offset, "x"); assertEquals(LocalVariableInfo.KIND_METHOD_ARG, info.getKind()); assertNull(info.getLastAssignment()); assertEquals(0, info.getConditionalAssignments().length); assertTrue (info.getDeclaringScope() instanceof MethodDeclaration); } public void testInsideMethod1_2() throws Exception { String content = loadContent(PATH_PREFIX + "method1.rb"); ModuleDeclaration ast = ASTUtils.getAST(content.toCharArray()); int offset = content.indexOf("y = 53") + 1; LocalVariableInfo info = RubyTypeInferencingUtils.inspectLocalVariable(ast, offset, "x"); assertEquals(LocalVariableInfo.KIND_METHOD_ARG, info.getKind()); assertNotNull(info.getLastAssignment()); assertEquals(0, info.getConditionalAssignments().length); assertTrue (info.getDeclaringScope() instanceof MethodDeclaration); } public void testInsideMethod1_3() throws Exception { String content = loadContent(PATH_PREFIX + "method1.rb"); ModuleDeclaration ast = ASTUtils.getAST(content.toCharArray()); int offset = content.indexOf("puts \"") + 1; LocalVariableInfo info = RubyTypeInferencingUtils.inspectLocalVariable(ast, offset, "x"); assertEquals(0, info.getKind()); assertNotNull(info.getLastAssignment()); assertEquals(0, info.getConditionalAssignments().length); assertTrue (info.getDeclaringScope() instanceof ModuleDeclaration); } public void testInsideMethod1_4() throws Exception { String content = loadContent(PATH_PREFIX + "method1.rb"); ModuleDeclaration ast = ASTUtils.getAST(content.toCharArray()); int offset = content.indexOf("bye") + 1; LocalVariableInfo info = RubyTypeInferencingUtils.inspectLocalVariable(ast, offset, "y"); assertEquals(0, info.getKind()); assertNotNull(info.getLastAssignment()); assertEquals(0, info.getConditionalAssignments().length); assertTrue (info.getDeclaringScope() instanceof MethodDeclaration); } public void testInsideType1() throws Exception { String content = loadContent(PATH_PREFIX + "class1.rb"); ModuleDeclaration ast = ASTUtils.getAST(content.toCharArray()); int offset = content.indexOf("puts x") + 1; LocalVariableInfo info = RubyTypeInferencingUtils.inspectLocalVariable(ast, offset, "x"); assertTrue (info.getDeclaringScope() instanceof TypeDeclaration); assertEquals(0, info.getKind()); assertNotNull(info.getLastAssignment()); assertEquals(1, info.getConditionalAssignments().length); } public void testInsideType1_2() throws Exception { String content = loadContent(PATH_PREFIX + "class1.rb"); ModuleDeclaration ast = ASTUtils.getAST(content.toCharArray()); int offset = content.indexOf("yyyy") + 1; LocalVariableInfo info = RubyTypeInferencingUtils.inspectLocalVariable(ast, offset, "x"); assertEquals(0, info.getKind()); assertNull(info.getLastAssignment()); assertEquals(0, info.getConditionalAssignments().length); } public void testInsideType1_3() throws Exception { String content = loadContent(PATH_PREFIX + "class1.rb"); ModuleDeclaration ast = ASTUtils.getAST(content.toCharArray()); int offset = content.indexOf("bye") + 1; LocalVariableInfo info = RubyTypeInferencingUtils.inspectLocalVariable(ast, offset, "x"); assertTrue (info.getDeclaringScope() instanceof TypeDeclaration); assertEquals(0, info.getKind()); assertNotNull(info.getLastAssignment()); assertEquals(0, info.getConditionalAssignments().length); } public void testInsideType1_4() throws Exception { String content = loadContent(PATH_PREFIX + "class1.rb"); ModuleDeclaration ast = ASTUtils.getAST(content.toCharArray()); int offset = content.indexOf("putx") + 1; LocalVariableInfo info = RubyTypeInferencingUtils.inspectLocalVariable(ast, offset, "x"); assertTrue (info.getDeclaringScope() instanceof TypeDeclaration); assertEquals ("Cool", ((TypeDeclaration)(info.getDeclaringScope())).getName()); assertEquals(0, info.getKind()); assertNotNull(info.getLastAssignment()); assertEquals(0, info.getConditionalAssignments().length); } public void testInsideMethod2() throws Exception { String content = loadContent(PATH_PREFIX + "method2.rb"); ModuleDeclaration ast = ASTUtils.getAST(content.toCharArray()); int offset = content.indexOf("haha") + 1; LocalVariableInfo info = RubyTypeInferencingUtils.inspectLocalVariable(ast, offset, "x"); assertTrue (info.getDeclaringScope() instanceof MethodDeclaration); assertEquals(LocalVariableInfo.KIND_METHOD_ARG, info.getKind()); assertNotNull(info.getLastAssignment()); assertEquals(1, info.getConditionalAssignments().length); } public void testInsideMethod2_1() throws Exception { String content = loadContent(PATH_PREFIX + "method2.rb"); ModuleDeclaration ast = ASTUtils.getAST(content.toCharArray()); int offset = content.indexOf("puts x") + 1; LocalVariableInfo info = RubyTypeInferencingUtils.inspectLocalVariable(ast, offset, "x"); assertTrue (info.getDeclaringScope() instanceof MethodDeclaration); assertEquals(LocalVariableInfo.KIND_METHOD_ARG, info.getKind()); assertNull(info.getLastAssignment()); assertEquals(0, info.getConditionalAssignments().length); } public void testInsideMethod2_2() throws Exception { String content = loadContent(PATH_PREFIX + "method2.rb"); ModuleDeclaration ast = ASTUtils.getAST(content.toCharArray()); int offset = content.indexOf("gigi") + 1; LocalVariableInfo info = RubyTypeInferencingUtils.inspectLocalVariable(ast, offset, "x"); assertTrue (info.getDeclaringScope() instanceof MethodDeclaration); assertEquals(LocalVariableInfo.KIND_METHOD_ARG, info.getKind()); assertNull(info.getLastAssignment()); assertEquals(1, info.getConditionalAssignments().length); } public void testLoops1() throws Exception { String content = loadContent(PATH_PREFIX + "loop1.rb"); ModuleDeclaration ast = ASTUtils.getAST(content.toCharArray()); int offset = content.indexOf("puts var") + 1; LocalVariableInfo info = RubyTypeInferencingUtils.inspectLocalVariable(ast, offset, "var"); assertTrue (info.getDeclaringScope() instanceof TypeDeclaration); assertEquals(LocalVariableInfo.KIND_DEFAULT, info.getKind()); assertNotNull(info.getLastAssignment()); assertEquals(0, info.getConditionalAssignments().length); } public void testLoops1_2() throws Exception { String content = loadContent(PATH_PREFIX + "loop1.rb"); ModuleDeclaration ast = ASTUtils.getAST(content.toCharArray()); int offset = content.indexOf("for") - 2; LocalVariableInfo info = RubyTypeInferencingUtils.inspectLocalVariable(ast, offset, "var"); assertTrue (info.getDeclaringScope() instanceof MethodDeclaration); assertEquals(LocalVariableInfo.KIND_METHOD_ARG, info.getKind()); assertNotNull(info.getLastAssignment()); assertEquals(0, info.getConditionalAssignments().length); } public void testLoops1_3() throws Exception { String content = loadContent(PATH_PREFIX + "loop1.rb"); ModuleDeclaration ast = ASTUtils.getAST(content.toCharArray()); int offset = content.indexOf("putX var") + 1; LocalVariableInfo info = RubyTypeInferencingUtils.inspectLocalVariable(ast, offset, "var"); assertTrue (info.getDeclaringScope() instanceof MethodDeclaration); assertEquals(LocalVariableInfo.KIND_LOOP_VAR, info.getKind()); assertNotNull(info.getLastAssignment()); assertEquals(0, info.getConditionalAssignments().length); } public void testLoops1_4() throws Exception { String content = loadContent(PATH_PREFIX + "loop1.rb"); ModuleDeclaration ast = ASTUtils.getAST(content.toCharArray()); int offset = content.indexOf("putxxx") + 1; LocalVariableInfo info = RubyTypeInferencingUtils.inspectLocalVariable(ast, offset, "var"); assertTrue (info.getDeclaringScope() instanceof MethodDeclaration); assertEquals(LocalVariableInfo.KIND_LOOP_VAR, info.getKind()); assertNotNull(info.getLastAssignment()); assertEquals(0, info.getConditionalAssignments().length); } public void testBlocks1() throws Exception { String content = loadContent(PATH_PREFIX + "blocks1.rb"); ModuleDeclaration ast = ASTUtils.getAST(content.toCharArray()); int offset = content.indexOf("label1") + 1; LocalVariableInfo info = RubyTypeInferencingUtils.inspectLocalVariable(ast, offset, "var"); assertTrue (info.getDeclaringScope() instanceof MethodDeclaration); assertEquals(LocalVariableInfo.KIND_BLOCK_ARG, info.getKind()); assertNull(info.getLastAssignment()); assertEquals(0, info.getConditionalAssignments().length); } public void testBlocks1_2() throws Exception { String content = loadContent(PATH_PREFIX + "blocks1.rb"); ModuleDeclaration ast = ASTUtils.getAST(content.toCharArray()); int offset = content.indexOf("label2") + 1; LocalVariableInfo info = RubyTypeInferencingUtils.inspectLocalVariable(ast, offset, "var"); assertTrue (info.getDeclaringScope() instanceof MethodDeclaration); assertEquals(LocalVariableInfo.KIND_DEFAULT, info.getKind()); assertNotNull(info.getLastAssignment()); assertEquals(0, info.getConditionalAssignments().length); } public void testBlocks1_3() throws Exception { String content = loadContent(PATH_PREFIX + "blocks1.rb"); ModuleDeclaration ast = ASTUtils.getAST(content.toCharArray()); int offset = content.indexOf("label3") + 1; LocalVariableInfo info = RubyTypeInferencingUtils.inspectLocalVariable(ast, offset, "var"); assertTrue (info.getDeclaringScope() instanceof MethodDeclaration); assertEquals(LocalVariableInfo.KIND_BLOCK_ARG, info.getKind()); assertNull(info.getLastAssignment()); assertEquals(1, info.getConditionalAssignments().length); } public void testBlocks1_4() throws Exception { String content = loadContent(PATH_PREFIX + "blocks1.rb"); ModuleDeclaration ast = ASTUtils.getAST(content.toCharArray()); int offset = content.indexOf("label4") + 1; LocalVariableInfo info = RubyTypeInferencingUtils.inspectLocalVariable(ast, offset, "var"); assertTrue (info.getDeclaringScope() instanceof TypeDeclaration); assertEquals(LocalVariableInfo.KIND_DEFAULT, info.getKind()); assertNull(info.getLastAssignment()); assertEquals(1, info.getConditionalAssignments().length); } }