DoWhatIMeanSupport.st
changeset 3475 8ed28a1e4e37
parent 3470 5cbf651bb214
child 3532 c79c6acf377d
--- a/DoWhatIMeanSupport.st	Fri Jul 11 21:40:24 2008 +0200
+++ b/DoWhatIMeanSupport.st	Sat Jul 12 17:23:08 2008 +0200
@@ -13,7 +13,7 @@
 
 Object subclass:#DoWhatIMeanSupport
 	instanceVariableNames:''
-	classVariableNames:''
+	classVariableNames:'LastSource LastParseTree'
 	poolDictionaries:''
 	category:'System-Support'
 !
@@ -667,18 +667,25 @@
     interval isEmpty ifTrue: [^ nil].
     RBParser isNil ifTrue: [^ nil].
 
-    tree := RBParser
+    source = LastSource ifTrue:[
+        tree := LastParseTree.
+    ] ifFalse:[
+        tree := RBParser
                 parseMethod:source
                 onError: [:str :err ":nodesSoFar" | ^ nil].
+    
+        tree isNil ifTrue:[^ nil].
 
-    tree isNil ifTrue:[^ nil].
+        LastSource := source.
+        LastParseTree := tree.
+    ].
 
     node := tree whichNodeIsContainedBy:interval.
     node isNil ifTrue: [
-        node := tree bestNodeFor: interval
-    ].
-    node isNil ifTrue: [
-        node := DoWhatIMeanSupport findNodeIn:tree forInterval:interval
+        node := tree bestNodeFor: interval.
+        node isNil ifTrue: [
+            node := DoWhatIMeanSupport findNodeIn:tree forInterval:interval
+        ].
     ].
     ^ node
 
@@ -691,7 +698,10 @@
     interval isEmpty ifTrue: [^ nil].
     RBParser isNil ifTrue: [^ nil].
 
-    tree := RBParser
+    source = LastSource ifTrue:[
+        tree := LastParseTree.
+    ] ifFalse:[
+        tree := RBParser
                 parseMethod:source
                 onError: [:str :err :nodesSoFar |
                                 |nodes|
@@ -708,6 +718,10 @@
                 rememberNodes:true.
 "/                onError: [:str :err | errCount := (errCount?0) + 1. self halt.]
 "/                proceedAfterError:true.
+        tree isNil ifTrue:[^ nil].
+        LastSource := source.
+        LastParseTree := tree.
+    ].
 
     ^ self findNodeForInterval:interval inParseTree:tree.
 !
@@ -719,6 +733,9 @@
     parseTree isNil ifTrue:[^ nil].
 
     node := parseTree whichNodeIsContainedBy:interval.
+    node isNil ifTrue:[
+        node := parseTree whichNodeIntersects:interval.
+    ].
     node isNil ifTrue: [
         node := self findNodeIn:parseTree forInterval:interval
     ].
@@ -785,7 +802,10 @@
 treeForCode:source allowErrors:allowErrors
     |tree|
 
-    tree := RBParser
+    source = LastSource ifTrue:[
+        tree := LastParseTree.
+    ] ifFalse:[
+        tree := RBParser
                 parseMethod:source
                 onError: [:str :err :nodesSoFar :parser|
                         allowErrors ifTrue:[
@@ -795,7 +815,10 @@
                     ]
                 proceedAfterError:false
                 rememberNodes:true.
-
+        tree isNil ifTrue:[^ nil].
+        LastSource := source.
+        LastParseTree := tree.
+    ].
     ^ tree
 ! !
 
@@ -1610,5 +1633,5 @@
 !DoWhatIMeanSupport class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libwidg2/DoWhatIMeanSupport.st,v 1.34 2008-07-09 19:17:06 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libwidg2/DoWhatIMeanSupport.st,v 1.35 2008-07-12 15:23:08 cg Exp $'
 ! !