2
0
Bläddra i källkod

Better error reporting for jtalkc.

Göran Krampe 13 år sedan
förälder
incheckning
31d7b97cee
4 ändrade filer med 62 tillägg och 5 borttagningar
  1. 15 0
      js/Compiler.js
  2. 34 4
      js/Parser.js
  3. 4 0
      st/Compiler.st
  4. 9 1
      st/Parser.st

+ 15 - 0
js/Compiler.js

@@ -1497,6 +1497,21 @@ referencedClasses: []
 }),
 smalltalk.Compiler);
 
+smalltalk.addMethod(
+'_visitFailure_',
+smalltalk.method({
+selector: 'visitFailure:',
+category: 'visiting',
+fn: function (aFailure){
+var self=this;
+smalltalk.send(self, "_error_", [smalltalk.send(aFailure, "_asString", [])]);
+return self;},
+source: unescape('visitFailure%3A%20aFailure%0A%09self%20error%3A%20aFailure%20asString'),
+messageSends: ["error:", "asString"],
+referencedClasses: []
+}),
+smalltalk.Compiler);
+
 
 smalltalk.addMethod(
 '_recompile_',

+ 34 - 4
js/Parser.js

@@ -225,11 +225,11 @@ selector: 'parse:',
 category: 'parsing',
 fn: function (aStream){
 var self=this;
-return smalltalk.send(smalltalk.send(aStream, "_atEnd", []), "_ifFalse_ifTrue_", [(function(){return smalltalk.send(smalltalk.send(smalltalk.PPFailure, "_new", []), "_reason_at_", ["EOF expected", smalltalk.send(aStream, "_position", [])]);}), (function(){return nil;})]);
+return smalltalk.send(smalltalk.send(aStream, "_atEnd", []), "_ifFalse_ifTrue_", [(function(){return smalltalk.send(smalltalk.send(smalltalk.PPFailure, "_new", []), "_reason_at_", [smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(smalltalk.send(aStream, "_contents", []), "__comma", [smalltalk.send(smalltalk.String, "_lf", [])]), "__comma", [unescape("---------------")]), "__comma", [smalltalk.send(smalltalk.String, "_lf", [])]), "__comma", ["EOF expected"]), smalltalk.send(aStream, "_position", [])]);}), (function(){return nil;})]);
 return self;},
-source: unescape('parse%3A%20aStream%0A%09%5EaStream%20atEnd%20%0A%09%20%20%20%20ifFalse%3A%20%5B%0A%09%09PPFailure%20new%20reason%3A%20%27EOF%20expected%27%20at%3A%20aStream%20position%5D%0A%09%20%20%20%20ifTrue%3A%20%5Bnil%5D%0A'),
-messageSends: ["ifFalse:ifTrue:", "atEnd", "reason:at:", "new", "position"],
-referencedClasses: [smalltalk.nil]
+source: unescape('parse%3A%20aStream%0A%09%5EaStream%20atEnd%20%0A%09%20%20%20%20ifFalse%3A%20%5B%0A%09%09PPFailure%20new%20reason%3A%20aStream%20contents%2C%20String%20lf%2C%20%27---------------%27%2C%20String%20lf%2C%20%27EOF%20expected%27%20at%3A%20aStream%20position%5D%0A%09%20%20%20%20ifTrue%3A%20%5Bnil%5D%0A'),
+messageSends: ["ifFalse:ifTrue:", "atEnd", "reason:at:", "new", unescape("%2C"), "contents", "lf", "position"],
+referencedClasses: [smalltalk.PPFailure,smalltalk.String]
 }),
 smalltalk.PPEOFParser);
 
@@ -917,6 +917,36 @@ referencedClasses: []
 }),
 smalltalk.PPFailure);
 
+smalltalk.addMethod(
+'_accept_',
+smalltalk.method({
+selector: 'accept:',
+category: 'accessing',
+fn: function (aVisitor){
+var self=this;
+smalltalk.send(aVisitor, "_visitFailure_", [self]);
+return self;},
+source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitFailure%3A%20self'),
+messageSends: ["visitFailure:"],
+referencedClasses: []
+}),
+smalltalk.PPFailure);
+
+smalltalk.addMethod(
+'_asString',
+smalltalk.method({
+selector: 'asString',
+category: 'testing',
+fn: function (){
+var self=this;
+return smalltalk.send(smalltalk.send(self['@reason'], "__comma", [" at "]), "__comma", [smalltalk.send(self['@position'], "_asString", [])]);
+return self;},
+source: unescape('asString%0A%09%5Ereason%2C%20%27%20at%20%27%2C%20position%20asString'),
+messageSends: [unescape("%2C"), "asString"],
+referencedClasses: []
+}),
+smalltalk.PPFailure);
+
 
 smalltalk.addMethod(
 '_reason_at_',

+ 4 - 0
st/Compiler.st

@@ -734,6 +734,10 @@ visitVariableNode: aNode
 
 visitJSStatementNode: aNode
 	stream nextPutAll: (aNode source value replace: '''''' with: '''')
+!
+
+visitFailure: aFailure
+	self error: aFailure asString
 ! !
 
 !Compiler class methodsFor: 'compiling'!

+ 9 - 1
st/Parser.st

@@ -103,7 +103,7 @@ PPParser subclass: #PPEOFParser
 parse: aStream
 	^aStream atEnd 
 	    ifFalse: [
-		PPFailure new reason: 'EOF expected' at: aStream position]
+		PPFailure new reason: aStream contents, String lf, '---------------', String lf, 'EOF expected' at: aStream position]
 	    ifTrue: [nil]
 
 ! !
@@ -499,6 +499,10 @@ reason: aString at: anInteger
 	    reason: aString; 
 	    position: anInteger
 
+!
+
+accept: aVisitor
+	aVisitor visitFailure: self
 ! !
 
 !PPFailure methodsFor: 'testing'!
@@ -506,6 +510,10 @@ reason: aString at: anInteger
 isParseFailure
 	^true
 
+!
+
+asString
+	^reason, ' at ', position asString
 ! !
 
 !PPFailure class methodsFor: 'instance creation'!