/** * Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved. * Licensed under the terms of the Eclipse Public License (EPL). * Please see the license.txt included with this distribution for details. * Any modifications to this file must keep this entire header intact. */ /* * Created on May 16, 2006 */ package com.python.pydev.analysis.scopeanalysis; import java.util.List; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jface.text.Document; import org.python.pydev.core.IToken; import org.python.pydev.core.docutils.PySelection; import org.python.pydev.core.docutils.StringUtils; import org.python.pydev.editor.codecompletion.revisited.modules.AbstractModule; import org.python.pydev.editor.codecompletion.revisited.modules.SourceModule; import org.python.pydev.editor.codecompletion.revisited.modules.SourceToken; import org.python.pydev.parser.jython.SimpleNode; import org.python.pydev.parser.visitors.NodeUtils; import com.python.pydev.analysis.AnalysisTestsBase; import com.python.pydev.analysis.messages.AbstractMessage; public class ScopeAnalyzerVisitorTest extends AnalysisTestsBase { public static void main(String[] args) { try { ScopeAnalyzerVisitorTest test = new ScopeAnalyzerVisitorTest(); test.setUp(); test.testIt8(); test.tearDown(); junit.textui.TestRunner.run(ScopeAnalyzerVisitorTest.class); } catch (Exception e) { e.printStackTrace(); } } private Document doc; public void testIt2() throws Exception { doc = new Document("import os\n" + "print os\n" + "\n"); int line = 0; int col = 8; List<IToken> tokenOccurrences = getTokenOccurrences(line, col); assertEquals(2, tokenOccurrences.size()); assertEquals(0, AbstractMessage.getStartLine(tokenOccurrences.get(0), doc) - 1); assertEquals(7, AbstractMessage.getStartCol(tokenOccurrences.get(0), doc) - 1); assertEquals(1, tokenOccurrences.get(1).getLineDefinition() - 1); assertEquals(6, tokenOccurrences.get(1).getColDefinition() - 1); } public void testIt4() throws Exception { doc = new Document("print os\n" + "\n"); int line = 0; int col = 7; //if we don't have the definition, we may still have occurrences List<IToken> tokenOccurrences = getTokenOccurrences(line, col); assertEquals(1, tokenOccurrences.size()); } public void testIt5() throws Exception { doc = new Document("foo = 10\n" + "print foo\n" + "foo = 20\n" + "print foo\n" + "\n"); int line = 0; int col = 0; //if we don't have the definition, we don't have any references... List<IToken> tokenOccurrences = getTokenOccurrences(line, col); assertEquals(4, tokenOccurrences.size()); } public void testIt6() throws Exception { doc = new Document("foo = 10\n" + "foo.a = 10\n" + "print foo.a\n" + "foo.a = 20\n" + "print foo.a\n" + "\n"); assertEquals(4, getTokenOccurrences(1, 4).size()); assertEquals(5, getTokenOccurrences(1, 0).size()); } public void testIt3() throws Exception { doc = new Document("import os.path.os\n" + "print os.path.os\n" + "\n"); checkTestResults(0, 10, "path"); checkTestResults(1, 10, "path"); checkTestResults(0, 7, "os"); checkTestResults(1, 7, "os"); checkTestResults(0, 15, "os"); checkTestResults(1, 15, "os"); //let's see if it checks the relative position correctly } public void testIt7() throws Exception { doc = new Document("from os import path\n" + "print path\n" + "\n"); checkTestResults(0, 15, "path"); checkTestResults(1, 15, "path"); } public void testIt8() throws Exception { doc = new Document("from os import foo, path\n" + "print path\n" + "\n"); checkTestResults(0, 20, "path"); checkTestResults(1, 20, "path"); } public void testIt9() throws Exception { doc = new Document("from os import foo as path\n" + "print path\n" + "\n"); checkTestResults(0, 22, "path"); checkTestResults(1, 22, "path"); } public void testIt10() throws Exception { doc = new Document("import path as foo\n" + "print foo\n" + "\n"); checkTestResults(0, 15, "foo"); checkTestResults(1, 15, "foo"); } public void testIt11() throws Exception { doc = new Document("print foo\n" + "print foo\n" + "\n"); checkTestResults(0, 15, "foo"); checkTestResults(1, 15, "foo", false); } public void testIt12() throws Exception { doc = new Document("def m1():\n" + " print foo\n" + " print bla.foo\n" + "\n"); List<IToken> tokenOccurrences = getTokenOccurrences(1, 11); assertEquals(1, tokenOccurrences.size()); } public void testIt13() throws Exception { doc = new Document("def m1():\n" + " print foo.bla\n" + //accessing this should not get the locals " print bla\n"); List<IToken> tokenOccurrences = getTokenOccurrences(1, 15); assertEquals(1, tokenOccurrences.size()); } public void testIt14() throws Exception { doc = new Document("def checkProps(self):\n" + " getattr(self).value\n" + "\n"); List<IToken> tokenOccurrences = getTokenOccurrences(0, 16); assertEquals(2, tokenOccurrences.size()); } public void testIt15() throws Exception { doc = new Document("from testrec2.core import leaf\n" + "class Foo(leaf.Leaf):\n" + //on the Leaf part " def setUp(self):\n" + " leaf.Leaf.setUp(self)"); List<IToken> tokenOccurrences = getTokenOccurrences(1, 17); assertEquals(2, tokenOccurrences.size()); assertEquals(1, tokenOccurrences.get(0).getLineDefinition() - 1); assertEquals(15, tokenOccurrences.get(0).getColDefinition() - 1); assertEquals(3, tokenOccurrences.get(1).getLineDefinition() - 1); assertEquals(13, tokenOccurrences.get(1).getColDefinition() - 1); } public void testIt16() throws Exception { doc = new Document("import b \n" + "print b.bar\n" + //this one is selected (b is undefined) "class C2:\n" + " def m1(self):\n" + " bar = 10\n" //should not get this one ); List<IToken> tokenOccurrences = getTokenOccurrences(1, 10); assertEquals(1, tokenOccurrences.size()); } public void testIt17() throws Exception { doc = new Document("import testlib \n" + "print testlib.bar\n" + //this one is selected (bar is undefined) "class C2:\n" + " def m1(self):\n" + " bar = 10\n" //should not get this one ); List<IToken> tokenOccurrences = getTokenOccurrences(1, 16); assertEquals(1, tokenOccurrences.size()); } public void testIt18() throws Exception { doc = new Document("import bla as fooo\n" + "raise fooo.ffff(msg)\n"); List<IToken> tokenOccurrences = getTokenOccurrences(0, 16); assertEquals(2, tokenOccurrences.size()); IToken t0 = tokenOccurrences.get(0); IToken t1 = tokenOccurrences.get(1); SimpleNode ast0 = ((SourceToken) t0).getAst(); SimpleNode ast1 = ((SourceToken) t1).getAst(); assertEquals("fooo", t0.getRepresentation()); assertEquals("fooo", t1.getRepresentation()); assertEquals(15, NodeUtils.getColDefinition(ast0)); assertEquals(7, NodeUtils.getColDefinition(ast1)); } public void testIt19() throws Exception { doc = new Document("import os.path\n" + "print os.path\n"); List<IToken> tokenOccurrences = getTokenOccurrences(0, 10); assertEquals(2, tokenOccurrences.size()); } public void testIt20() throws Exception { doc = new Document("def m1(): \n" + " class LocalFoo: \n" + " pass \n" + " print LocalFoo \n" + " \n" + "class LocalFoo: \n" + " pass \n" + "print LocalFoo \n"); List<IToken> tokenOccurrences = getTokenOccurrences(1, 13); assertEquals(2, tokenOccurrences.size()); } public void testIt21() throws Exception { doc = new Document("class LocalFoo: \n" + " pass \n" + "print LocalFoo \n"); List<IToken> tokenOccurrences = getTokenOccurrences(2, 8); assertEquals(2, tokenOccurrences.size()); } public void testIt22() throws Exception { doc = new Document("class LocalFoo(object): \n" + " pass \n"); List<IToken> tokenOccurrences = getTokenOccurrences(0, 17); assertEquals(1, tokenOccurrences.size()); } public void testIt23() throws Exception { doc = new Document("class Foo(object): \n" + " pass \n"); List<IToken> tokenOccurrences = getTokenOccurrences(0, 7); assertEquals(1, tokenOccurrences.size()); } public void testIt24() throws Exception { doc = new Document("import os\n" + "from os import path\n"); List<IToken> tokenOccurrences = getTokenOccurrences(0, 8); assertEquals(2, tokenOccurrences.size()); } public void testIt24a() throws Exception { doc = new Document("import os\n" + "from os import path\n"); List<IToken> tokenOccurrences = getTokenOccurrences(1, 6); assertEquals(2, tokenOccurrences.size()); } public void testIt24b() throws Exception { doc = new Document("from os import path\n" + "import os\n"); List<IToken> tokenOccurrences = getTokenOccurrences(0, 6); assertEquals(2, tokenOccurrences.size()); } public void testIt24c() throws Exception { doc = new Document("from os import path\n" + "import os\n"); List<IToken> tokenOccurrences = getTokenOccurrences(1, 8); assertEquals(2, tokenOccurrences.size()); } public void testIt24d() throws Exception { doc = new Document("from notFound import path\n" + "import notFound\n"); List<IToken> tokenOccurrences = getTokenOccurrences(1, 8); assertEquals(2, tokenOccurrences.size()); } public void testIt25() throws Exception { doc = new Document("def m1():\n" + " import os\n" + "def m2():\n" + " import os\n" + "\n"); List<IToken> tokenOccurrences = getTokenOccurrences(1, 12); assertEquals(2, tokenOccurrences.size()); } public void testIt25a() throws Exception { doc = new Document("import os\n" + "import os\n" + "\n"); List<IToken> tokenOccurrences = getTokenOccurrences(0, 8); assertEquals(2, tokenOccurrences.size()); } public void testIt25b() throws Exception { doc = new Document("import os\n" + "import os\n" + "from os import path\n" + "\n"); List<IToken> tokenOccurrences = getTokenOccurrences(2, 6); assertEquals(3, tokenOccurrences.size()); } public void testIt26() throws Exception { doc = new Document("def m1():\n" + " import os\n" + " print os\n" + " \n" + "def m2():\n" + " import os\n" + " print os\n" + "\n"); List<IToken> tokenOccurrences = getTokenOccurrences(1, 12); assertEquals(4, tokenOccurrences.size()); } public void testIt27() throws Exception { doc = new Document("def m1():\n" + " import os.path\n" + " print os.path\n" + " \n" + "def m2():\n" + " import os.path\n" + " print os.path\n" + "\n"); List<IToken> tokenOccurrences = getTokenOccurrences(1, 15); assertEquals(4, tokenOccurrences.size()); assertContains(1, 14, tokenOccurrences); assertContains(2, 13, tokenOccurrences); assertContains(5, 14, tokenOccurrences); assertContains(6, 13, tokenOccurrences); } public void testIt27a() throws Exception { doc = new Document("def m1():\n" + " import os.path.os\n" + " print os.path.os\n" + " \n" + "def m2():\n" + " import os.path.os\n" + " print os.path.os\n" + "\n"); List<IToken> tokenOccurrences = getTokenOccurrences(1, 20); assertEquals(4, tokenOccurrences.size()); assertContains(1, 19, tokenOccurrences); assertContains(2, 18, tokenOccurrences); assertContains(5, 19, tokenOccurrences); assertContains(6, 18, tokenOccurrences); } public void testIt28() throws Exception { doc = new Document("def m1():\n" + " Foo()\n" + "class Foo(object):\n" + " pass\n" + "\n"); List<IToken> tokenOccurrences = getTokenOccurrences(2, 7); assertEquals(2, tokenOccurrences.size()); assertContains(1, 4, tokenOccurrences); assertContains(2, 6, tokenOccurrences); } public void testIt29() throws Exception { doc = new Document("class DefaultProcessFactory(object):\n" + " \n" + " def _DoCreateIt(self, root_info):\n" + " pass\n" + " \n" + " def CreateIt(self, a):\n" + " for root_info in a.GetRootInfos():\n" + " self._DoCreateIt(root_info)\n" + "\n"); List<IToken> tokenOccurrences = getTokenOccurrences(2, 27); assertEquals(1, tokenOccurrences.size()); } public void testIt30() throws Exception { doc = new Document("class ActionProvider(object):\n" + " \n" + " def SlotImportSimulation(cls):\n" + " ActionProvider()._DoSlotImportSimulation()\n" + "\n" + "\n"); List<IToken> tokenOccurrences = getTokenOccurrences(0, 7); assertEquals(2, tokenOccurrences.size()); for (IToken token : tokenOccurrences) { int colDefinition = token.getColDefinition(); assertTrue(colDefinition == 7 || colDefinition == 9); } } /** * Check if we have some occurrence at the line/col specified */ private void assertContains(int line, int col, List<IToken> tokenOccurrences) { StringBuffer buf = new StringBuffer(com.aptana.shared_core.string.StringUtils.format("Not Found at L:%s C:%s", line, col)); for (IToken token : tokenOccurrences) { if (token.getLineDefinition() - 1 == line && token.getColDefinition() - 1 == col) { return; } buf.append("\nFound:"); buf.append(" L:"); buf.append(token.getLineDefinition() - 1); buf.append(" C:"); buf.append(token.getColDefinition() - 1); } fail(buf.toString()); } // do we want to check self ? // public void testIt16() throws Exception { // doc = new Document( // "class Foo:\n" + // " vlMolecularWeigth = ''\n" + // " def toSimulator(self):\n" + // " print self.vlMolecularWeigth\n" + // "" // ); // List<IToken> tokenOccurrences = getTokenOccurrences(3, 21); // assertEquals(2, tokenOccurrences.size()); // } private void checkTestResults(int line, int col, String lookFor) throws Exception { checkTestResults(line, col, lookFor, true); } private void checkTestResults(int line, int col, String lookFor, boolean checkPositions) throws Exception { List<IToken> tokenOccurrences = getTokenOccurrences(line, col); if (tokenOccurrences.size() != 2) { System.out.println("Found occurrences:"); for (IToken token : tokenOccurrences) { System.out.println(token); System.out.println("line:" + (AbstractMessage.getStartLine(token, doc) - 1)); System.out.println("col:" + (AbstractMessage.getStartCol(token, doc) - 1)); } } assertEquals(2, tokenOccurrences.size()); IToken tok0 = tokenOccurrences.get(0); assertEquals(lookFor, tok0.getRepresentation()); if (checkPositions) { assertEquals(0, AbstractMessage.getStartLine(tok0, doc) - 1); assertEquals(col, AbstractMessage.getStartCol(tok0, doc) - 1); } IToken tok1 = tokenOccurrences.get(1); assertEquals(lookFor, tok1.getRepresentation()); if (checkPositions) { assertEquals(1, AbstractMessage.getStartLine(tok1, doc) - 1); assertEquals(col, AbstractMessage.getStartCol(tok1, doc) - 1); } } public void testIt() throws Exception { doc = new Document("foo = 20\n" + "print foo\n" + "\n"); List<IToken> toks = getTokenOccurrences(0, 1); assertEquals(2, toks.size()); assertEquals(0, toks.get(0).getLineDefinition() - 1); assertEquals(0, toks.get(0).getColDefinition() - 1); assertEquals(1, toks.get(1).getLineDefinition() - 1); assertEquals(6, toks.get(1).getColDefinition() - 1); } /** * @param line: 0 based * @param col: 0 based */ private List<IToken> getTokenOccurrences(int line, int col) throws Exception { ScopeAnalyzerVisitor visitor = doVisit(line, col); List<IToken> ret = visitor.getTokenOccurrences(); return ret; } private ScopeAnalyzerVisitor doVisit(int line, int col) throws Exception { SourceModule mod = (SourceModule) AbstractModule.createModuleFromDoc(null, null, doc, nature, true); PySelection ps = new PySelection(doc, line, col); ScopeAnalyzerVisitor visitor = new ScopeAnalyzerVisitor(nature, "mod1", mod, new NullProgressMonitor(), ps); mod.getAst().accept(visitor); return visitor; } }