Kaynağa Gözat

- Support for dynamic arrays
- Support for dynamic dictionaries:
#{1 -> 'a'. 2 -> 'b'}

Nicolas Petton 12 yıl önce
ebeveyn
işleme
6f76c63de0
8 değiştirilmiş dosya ile 4295 ekleme ve 2 silme
  1. 76 0
      js/Compiler.deploy.js
  2. 101 1
      js/Compiler.js
  3. 14 0
      js/Kernel.deploy.js
  4. 18 0
      js/Kernel.js
  5. 4023 0
      js/parser.js
  6. 10 1
      js/parser.pegjs
  7. 44 0
      st/Compiler.st
  8. 9 0
      st/Kernel.st

+ 76 - 0
js/Compiler.deploy.js

@@ -1095,6 +1095,28 @@ return self;}
 }),
 smalltalk.NodeVisitor);
 
+smalltalk.addMethod(
+'_visitDynamicArrayNode_',
+smalltalk.method({
+selector: 'visitDynamicArrayNode:',
+fn: function (aNode){
+var self=this;
+smalltalk.send(self, "_visitNode_", [aNode]);
+return self;}
+}),
+smalltalk.NodeVisitor);
+
+smalltalk.addMethod(
+'_visitDynamicDictionaryNode_',
+smalltalk.method({
+selector: 'visitDynamicDictionaryNode:',
+fn: function (aNode){
+var self=this;
+smalltalk.send(self, "_visitNode_", [aNode]);
+return self;}
+}),
+smalltalk.NodeVisitor);
+
 
 
 smalltalk.addClass('Compiler', smalltalk.NodeVisitor, ['stream', 'nestedBlocks', 'earlyReturn', 'currentClass', 'currentSelector', 'unknownVariables', 'tempVariables', 'messageSends', 'referencedClasses', 'classReferenced', 'source'], 'Compiler');
@@ -1685,6 +1707,32 @@ return self;}
 }),
 smalltalk.Compiler);
 
+smalltalk.addMethod(
+'_visitDynamicArrayNode_',
+smalltalk.method({
+selector: 'visitDynamicArrayNode:',
+fn: function (aNode){
+var self=this;
+smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%5B")]);
+smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_separatedBy_", [(function(each){return smalltalk.send(self, "_visit_", [each]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%2C")]);})]);
+smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%5D")]);
+return self;}
+}),
+smalltalk.Compiler);
+
+smalltalk.addMethod(
+'_visitDynamicDictionaryNode_',
+smalltalk.method({
+selector: 'visitDynamicDictionaryNode:',
+fn: function (aNode){
+var self=this;
+smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("smalltalk.Dictionary._fromPairs_%28%5B")]);
+smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_separatedBy_", [(function(each){return smalltalk.send(self, "_visit_", [each]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%2C")]);})]);
+smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%5D%29")]);
+return self;}
+}),
+smalltalk.Compiler);
+
 
 smalltalk.Compiler.klass.iVarNames = ['performOptimizations'];
 smalltalk.addMethod(
@@ -1737,3 +1785,31 @@ smalltalk.Compiler.klass);
 smalltalk.addClass('DoIt', smalltalk.Object, [], 'Compiler');
 
 
+smalltalk.addClass('DynamicArrayNode', smalltalk.Node, [], 'Compiler');
+smalltalk.addMethod(
+'_accept_',
+smalltalk.method({
+selector: 'accept:',
+fn: function (aVisitor){
+var self=this;
+smalltalk.send(aVisitor, "_visitDynamicArrayNode_", [self]);
+return self;}
+}),
+smalltalk.DynamicArrayNode);
+
+
+
+smalltalk.addClass('DynamicDictionaryNode', smalltalk.Node, [], 'Compiler');
+smalltalk.addMethod(
+'_accept_',
+smalltalk.method({
+selector: 'accept:',
+fn: function (aVisitor){
+var self=this;
+smalltalk.send(aVisitor, "_visitDynamicDictionaryNode_", [self]);
+return self;}
+}),
+smalltalk.DynamicDictionaryNode);
+
+
+

+ 101 - 1
js/Compiler.js

@@ -1459,6 +1459,36 @@ referencedClasses: []
 }),
 smalltalk.NodeVisitor);
 
+smalltalk.addMethod(
+'_visitDynamicArrayNode_',
+smalltalk.method({
+selector: 'visitDynamicArrayNode:',
+category: 'visiting',
+fn: function (aNode){
+var self=this;
+smalltalk.send(self, "_visitNode_", [aNode]);
+return self;},
+source: unescape('visitDynamicArrayNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode'),
+messageSends: ["visitNode:"],
+referencedClasses: []
+}),
+smalltalk.NodeVisitor);
+
+smalltalk.addMethod(
+'_visitDynamicDictionaryNode_',
+smalltalk.method({
+selector: 'visitDynamicDictionaryNode:',
+category: 'visiting',
+fn: function (aNode){
+var self=this;
+smalltalk.send(self, "_visitNode_", [aNode]);
+return self;},
+source: unescape('visitDynamicDictionaryNode%3A%20aNode%0A%09self%20visitNode%3A%20aNode'),
+messageSends: ["visitNode:"],
+referencedClasses: []
+}),
+smalltalk.NodeVisitor);
+
 
 
 smalltalk.addClass('Compiler', smalltalk.NodeVisitor, ['stream', 'nestedBlocks', 'earlyReturn', 'currentClass', 'currentSelector', 'unknownVariables', 'tempVariables', 'messageSends', 'referencedClasses', 'classReferenced', 'source'], 'Compiler');
@@ -1493,7 +1523,7 @@ return smalltalk.send((smalltalk.SmalltalkParser || SmalltalkParser), "_new", []
 return self;},
 source: unescape('parser%0A%09%5ESmalltalkParser%20new'),
 messageSends: ["new"],
-referencedClasses: [smalltalk.SmalltalkParser]
+referencedClasses: [smalltalk.nil]
 }),
 smalltalk.Compiler);
 
@@ -2221,6 +2251,40 @@ referencedClasses: []
 }),
 smalltalk.Compiler);
 
+smalltalk.addMethod(
+'_visitDynamicArrayNode_',
+smalltalk.method({
+selector: 'visitDynamicArrayNode:',
+category: 'visiting',
+fn: function (aNode){
+var self=this;
+smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%5B")]);
+smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_separatedBy_", [(function(each){return smalltalk.send(self, "_visit_", [each]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%2C")]);})]);
+smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%5D")]);
+return self;},
+source: unescape('visitDynamicArrayNode%3A%20aNode%0A%09stream%20nextPutAll%3A%20%27%5B%27.%0A%09aNode%20nodes%20%0A%09%09do%3A%20%5B%3Aeach%20%7C%20self%20visit%3A%20each%5D%0A%09%09separatedBy%3A%20%5Bstream%20nextPutAll%3A%20%27%2C%27%5D.%0A%09stream%20nextPutAll%3A%20%27%5D%27'),
+messageSends: ["nextPutAll:", "do:separatedBy:", "nodes", "visit:"],
+referencedClasses: []
+}),
+smalltalk.Compiler);
+
+smalltalk.addMethod(
+'_visitDynamicDictionaryNode_',
+smalltalk.method({
+selector: 'visitDynamicDictionaryNode:',
+category: 'visiting',
+fn: function (aNode){
+var self=this;
+smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("smalltalk.Dictionary._fromPairs_%28%5B")]);
+smalltalk.send(smalltalk.send(aNode, "_nodes", []), "_do_separatedBy_", [(function(each){return smalltalk.send(self, "_visit_", [each]);}), (function(){return smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%2C")]);})]);
+smalltalk.send(self['@stream'], "_nextPutAll_", [unescape("%5D%29")]);
+return self;},
+source: unescape('visitDynamicDictionaryNode%3A%20aNode%0A%09stream%20nextPutAll%3A%20%27smalltalk.Dictionary._fromPairs_%28%5B%27.%0A%09%09aNode%20nodes%20%0A%09%09%09do%3A%20%5B%3Aeach%20%7C%20self%20visit%3A%20each%5D%0A%09%09%09separatedBy%3A%20%5Bstream%20nextPutAll%3A%20%27%2C%27%5D.%0A%09%09stream%20nextPutAll%3A%20%27%5D%29%27'),
+messageSends: ["nextPutAll:", "do:separatedBy:", "nodes", "visit:"],
+referencedClasses: []
+}),
+smalltalk.Compiler);
+
 
 smalltalk.Compiler.klass.iVarNames = ['performOptimizations'];
 smalltalk.addMethod(
@@ -2289,3 +2353,39 @@ smalltalk.Compiler.klass);
 smalltalk.addClass('DoIt', smalltalk.Object, [], 'Compiler');
 
 
+smalltalk.addClass('DynamicArrayNode', smalltalk.Node, [], 'Compiler');
+smalltalk.addMethod(
+'_accept_',
+smalltalk.method({
+selector: 'accept:',
+category: 'visiting',
+fn: function (aVisitor){
+var self=this;
+smalltalk.send(aVisitor, "_visitDynamicArrayNode_", [self]);
+return self;},
+source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitDynamicArrayNode%3A%20self'),
+messageSends: ["visitDynamicArrayNode:"],
+referencedClasses: []
+}),
+smalltalk.DynamicArrayNode);
+
+
+
+smalltalk.addClass('DynamicDictionaryNode', smalltalk.Node, [], 'Compiler');
+smalltalk.addMethod(
+'_accept_',
+smalltalk.method({
+selector: 'accept:',
+category: 'visiting',
+fn: function (aVisitor){
+var self=this;
+smalltalk.send(aVisitor, "_visitDynamicDictionaryNode_", [self]);
+return self;},
+source: unescape('accept%3A%20aVisitor%0A%09aVisitor%20visitDynamicDictionaryNode%3A%20self'),
+messageSends: ["visitDynamicDictionaryNode:"],
+referencedClasses: []
+}),
+smalltalk.DynamicDictionaryNode);
+
+
+

+ 14 - 0
js/Kernel.deploy.js

@@ -4535,6 +4535,20 @@ return self;}
 smalltalk.Dictionary);
 
 
+smalltalk.addMethod(
+'_fromPairs_',
+smalltalk.method({
+selector: 'fromPairs:',
+fn: function (aCollection){
+var self=this;
+var dict=nil;
+dict=smalltalk.send(self, "_new", []);
+smalltalk.send(aCollection, "_do_", [(function(each){return smalltalk.send(dict, "_add_", [each]);})]);
+return dict;
+return self;}
+}),
+smalltalk.Dictionary.klass);
+
 
 smalltalk.addClass('ClassBuilder', smalltalk.Object, [], 'Kernel');
 smalltalk.addMethod(

+ 18 - 0
js/Kernel.js

@@ -6080,6 +6080,24 @@ referencedClasses: [smalltalk.String]
 smalltalk.Dictionary);
 
 
+smalltalk.addMethod(
+'_fromPairs_',
+smalltalk.method({
+selector: 'fromPairs:',
+category: 'instance creation',
+fn: function (aCollection){
+var self=this;
+var dict=nil;
+dict=smalltalk.send(self, "_new", []);
+smalltalk.send(aCollection, "_do_", [(function(each){return smalltalk.send(dict, "_add_", [each]);})]);
+return dict;
+return self;},
+source: unescape('fromPairs%3A%20aCollection%0A%09%7C%20dict%20%7C%0A%09dict%20%3A%3D%20self%20new.%0A%09aCollection%20do%3A%20%5B%3Aeach%20%7C%20dict%20add%3A%20each%5D.%0A%09%5Edict'),
+messageSends: ["new", "do:", "add:"],
+referencedClasses: []
+}),
+smalltalk.Dictionary.klass);
+
 
 smalltalk.addClass('ClassBuilder', smalltalk.Object, [], 'Kernel');
 smalltalk.addMethod(

Dosya farkı çok büyük olduğundan ihmal edildi
+ 4023 - 0
js/parser.js


+ 10 - 1
js/parser.pegjs

@@ -25,7 +25,15 @@ literalArray   = "#(" ws lits:(lit:literal ws {return lit._value()})* ws ")" {
 		  return smalltalk.ValueNode._new()
                	   	._value_(lits)
                	 }
-literal        = number / literalArray / string / symbol / block
+dynamicArray   = "{" expressions:expressions? "}" {
+	       	  return smalltalk.DynamicArrayNode._new()
+		        ._nodes_(expressions)
+		  }
+dynamicDictionary = "#{" expressions: expressions? "}" {
+	       	  return smalltalk.DynamicDictionaryNode._new()
+		        ._nodes_(expressions)
+		  }
+literal        = number / literalArray / dynamicDictionary / dynamicArray / string / symbol / block
 
 
 variable       = identifier:identifier {
@@ -36,6 +44,7 @@ classReference = className:className {
 		  return smalltalk.ClassReferenceNode._new()
 		  	._value_(className)
 		  }
+
 reference      = variable / classReference
 
 keywordPair    = key:keyword ws arg:binarySend ws {return {key:key, arg: arg}}

+ 44 - 0
st/Compiler.st

@@ -704,6 +704,14 @@ visitJSStatementNode: aNode
 	    nextPutAll: 'function(){';
 	    nextPutAll: aNode source;
 	    nextPutAll: '})()'
+!
+
+visitDynamicArrayNode: aNode
+	self visitNode: aNode
+!
+
+visitDynamicDictionaryNode: aNode
+	self visitNode: aNode
 ! !
 
 NodeVisitor subclass: #Compiler
@@ -1306,6 +1314,22 @@ send: aSelector to: aReceiver arguments: aCollection superSend: aBoolean
 		aBoolean ifTrue: [
 			str nextPutAll: ', smalltalk.', (self classNameFor: self currentClass superclass)].
 		str nextPutAll: ')']
+!
+
+visitDynamicArrayNode: aNode
+	stream nextPutAll: '['.
+	aNode nodes 
+		do: [:each | self visit: each]
+		separatedBy: [stream nextPutAll: ','].
+	stream nextPutAll: ']'
+!
+
+visitDynamicDictionaryNode: aNode
+	stream nextPutAll: 'smalltalk.Dictionary._fromPairs_(['.
+		aNode nodes 
+			do: [:each | self visit: each]
+			separatedBy: [stream nextPutAll: ','].
+		stream nextPutAll: '])'
 ! !
 
 Compiler class instanceVariableNames: 'performOptimizations'!
@@ -1339,3 +1363,23 @@ Object subclass: #DoIt
 	instanceVariableNames: ''
 	category: 'Compiler'!
 
+Node subclass: #DynamicArrayNode
+	instanceVariableNames: ''
+	category: 'Compiler'!
+
+!DynamicArrayNode methodsFor: 'visiting'!
+
+accept: aVisitor
+	aVisitor visitDynamicArrayNode: self
+! !
+
+Node subclass: #DynamicDictionaryNode
+	instanceVariableNames: ''
+	category: 'Compiler'!
+
+!DynamicDictionaryNode methodsFor: 'visiting'!
+
+accept: aVisitor
+	aVisitor visitDynamicDictionaryNode: self
+! !
+

+ 9 - 0
st/Kernel.st

@@ -2215,6 +2215,15 @@ printString
                                  ]
 ! !
 
+!Dictionary class methodsFor: 'instance creation'!
+
+fromPairs: aCollection
+	| dict |
+	dict := self new.
+	aCollection do: [:each | dict add: each].
+	^dict
+! !
+
 Object subclass: #ClassBuilder
 	instanceVariableNames: ''
 	category: 'Kernel'!

Bu fark içinde çok fazla dosya değişikliği olduğu için bazı dosyalar gösterilmiyor