Browse Source

Push CharacterArray down to String.

Herby Vojčík 5 years ago
parent
commit
414fdc322d

+ 9 - 0
CHANGELOG

@@ -1,3 +1,12 @@
+? Jan 2019 - Release 0.22.2
+===================================
+
+* Fixes.
+* Push CharacterArray down, make it and alias to String and deprecate it.
+
+Commits: https://lolg.it/amber/amber/commits/0.22.2
+
+
 24 Jun 2018 - Release 0.22.1
 ===================================
 

+ 6 - 0
lang/API-CHANGES.txt

@@ -1,3 +1,9 @@
+0.22.2:
+
+* Merge CharacterArray class into String class
+* Deprecate CharacterArray class
+
+
 0.22.1:
 
 + BlockClosure >>

+ 2 - 0
lang/base/kernel-runtime.js

@@ -158,6 +158,8 @@ define(function () {
         this.__init__ = function () {
             st.alias(globals.Array, "OrderedCollection");
             st.alias(globals.Date, "Time");
+            // TODO deprecated, remove
+            st.alias(globals.String, "CharacterArray");
         }
     }
 

+ 207 - 404
lang/src/Kernel-Collections.js

@@ -5642,410 +5642,7 @@ messageSends: ["new:", "size", "do:", "at:put:", "+"]
 $globals.Array.a$cls);
 
 
-$core.addClass("CharacterArray", $globals.SequenceableCollection, [], "Kernel-Collections");
-//>>excludeStart("ide", pragmas.excludeIdeData);
-$globals.CharacterArray.comment="I am the abstract superclass of string-like collections.";
-//>>excludeEnd("ide");
-$core.addMethod(
-$core.method({
-selector: ",",
-protocol: "copying",
-fn: function (aString){
-var self=this,$self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-var $1;
-$1=$self._asString();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["asString"]=1;
-//>>excludeEnd("ctx");
-return $recv($1).__comma($recv(aString)._asString());
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,",",{aString:aString},$globals.CharacterArray)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["aString"],
-source: ", aString\x0a\x09^ self asString, aString asString",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: [",", "asString"]
-}),
-$globals.CharacterArray);
-
-$core.addMethod(
-$core.method({
-selector: "add:",
-protocol: "adding/removing",
-fn: function (anObject){
-var self=this,$self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-$self._errorReadOnly();
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"add:",{anObject:anObject},$globals.CharacterArray)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["anObject"],
-source: "add: anObject\x0a\x09self errorReadOnly",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: ["errorReadOnly"]
-}),
-$globals.CharacterArray);
-
-$core.addMethod(
-$core.method({
-selector: "asLowercase",
-protocol: "converting",
-fn: function (){
-var self=this,$self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-return $recv($self._class())._fromString_($recv($self._asString())._asLowercase());
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"asLowercase",{},$globals.CharacterArray)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "asLowercase\x0a\x09^ self class fromString: self asString asLowercase",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: ["fromString:", "class", "asLowercase", "asString"]
-}),
-$globals.CharacterArray);
-
-$core.addMethod(
-$core.method({
-selector: "asNumber",
-protocol: "converting",
-fn: function (){
-var self=this,$self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-return $recv($self._asString())._asNumber();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"asNumber",{},$globals.CharacterArray)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "asNumber\x0a\x09^ self asString asNumber",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: ["asNumber", "asString"]
-}),
-$globals.CharacterArray);
-
-$core.addMethod(
-$core.method({
-selector: "asString",
-protocol: "converting",
-fn: function (){
-var self=this,$self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-return $self._subclassResponsibility();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"asString",{},$globals.CharacterArray)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "asString\x0a\x09^ self subclassResponsibility",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: ["subclassResponsibility"]
-}),
-$globals.CharacterArray);
-
-$core.addMethod(
-$core.method({
-selector: "asSymbol",
-protocol: "converting",
-fn: function (){
-var self=this,$self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-return $self._asString();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"asSymbol",{},$globals.CharacterArray)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "asSymbol\x0a\x09^ self asString",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: ["asString"]
-}),
-$globals.CharacterArray);
-
-$core.addMethod(
-$core.method({
-selector: "asSymbolPrintOn:",
-protocol: "printing",
-fn: function (aStream){
-var self=this,$self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-var $1;
-$recv(aStream)._nextPutAll_("#");
-$1=$recv($self._asString())._isSelector();
-if($core.assert($1)){
-$recv(aStream)._nextPut_(self);
-} else {
-$self._printOn_(aStream);
-}
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"asSymbolPrintOn:",{aStream:aStream},$globals.CharacterArray)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["aStream"],
-source: "asSymbolPrintOn: aStream\x0a\x09aStream nextPutAll: '#'.\x0a\x09self asString isSelector\x0a\x09\x09ifTrue: [ aStream nextPut: self ]\x0a\x09\x09ifFalse: [ self printOn: aStream ]",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: ["nextPutAll:", "ifTrue:ifFalse:", "isSelector", "asString", "nextPut:", "printOn:"]
-}),
-$globals.CharacterArray);
-
-$core.addMethod(
-$core.method({
-selector: "asUppercase",
-protocol: "converting",
-fn: function (){
-var self=this,$self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-return $recv($self._class())._fromString_($recv($self._asString())._asUppercase());
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"asUppercase",{},$globals.CharacterArray)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "asUppercase\x0a\x09^ self class fromString: self asString asUppercase",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: ["fromString:", "class", "asUppercase", "asString"]
-}),
-$globals.CharacterArray);
-
-$core.addMethod(
-$core.method({
-selector: "at:put:",
-protocol: "accessing",
-fn: function (anIndex,anObject){
-var self=this,$self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-$self._errorReadOnly();
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"at:put:",{anIndex:anIndex,anObject:anObject},$globals.CharacterArray)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["anIndex", "anObject"],
-source: "at: anIndex put: anObject\x0a\x09self errorReadOnly",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: ["errorReadOnly"]
-}),
-$globals.CharacterArray);
-
-$core.addMethod(
-$core.method({
-selector: "errorReadOnly",
-protocol: "error handling",
-fn: function (){
-var self=this,$self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-$self._error_("Object is read-only");
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"errorReadOnly",{},$globals.CharacterArray)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "errorReadOnly\x0a\x09self error: 'Object is read-only'",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: ["error:"]
-}),
-$globals.CharacterArray);
-
-$core.addMethod(
-$core.method({
-selector: "printOn:",
-protocol: "printing",
-fn: function (aStream){
-var self=this,$self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-$recv($self._asString())._printOn_(aStream);
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"printOn:",{aStream:aStream},$globals.CharacterArray)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["aStream"],
-source: "printOn: aStream\x0a\x09self asString printOn: aStream",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: ["printOn:", "asString"]
-}),
-$globals.CharacterArray);
-
-$core.addMethod(
-$core.method({
-selector: "putOn:",
-protocol: "streaming",
-fn: function (aStream){
-var self=this,$self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-$recv(aStream)._nextPutString_(self);
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"putOn:",{aStream:aStream},$globals.CharacterArray)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["aStream"],
-source: "putOn: aStream\x0a\x09aStream nextPutString: self",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: ["nextPutString:"]
-}),
-$globals.CharacterArray);
-
-$core.addMethod(
-$core.method({
-selector: "remove:",
-protocol: "adding/removing",
-fn: function (anObject){
-var self=this,$self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-$self._errorReadOnly();
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"remove:",{anObject:anObject},$globals.CharacterArray)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["anObject"],
-source: "remove: anObject\x0a\x09self errorReadOnly",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: ["errorReadOnly"]
-}),
-$globals.CharacterArray);
-
-$core.addMethod(
-$core.method({
-selector: "remove:ifAbsent:",
-protocol: "adding/removing",
-fn: function (anObject,aBlock){
-var self=this,$self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-$self._errorReadOnly();
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"remove:ifAbsent:",{anObject:anObject,aBlock:aBlock},$globals.CharacterArray)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["anObject", "aBlock"],
-source: "remove: anObject ifAbsent: aBlock\x0a\x09self errorReadOnly",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: ["errorReadOnly"]
-}),
-$globals.CharacterArray);
-
-$core.addMethod(
-$core.method({
-selector: "symbolPrintString",
-protocol: "printing",
-fn: function (){
-var self=this,$self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-return $recv($globals.String)._streamContents_((function(str){
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx2) {
-//>>excludeEnd("ctx");
-return $self._asSymbolPrintOn_(str);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx2) {$ctx2.fillBlock({str:str},$ctx1,1)});
-//>>excludeEnd("ctx");
-}));
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"symbolPrintString",{},$globals.CharacterArray)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "symbolPrintString\x0a\x09^ String streamContents: [ :str | self asSymbolPrintOn: str ]",
-referencedClasses: ["String"],
-//>>excludeEnd("ide");
-messageSends: ["streamContents:", "asSymbolPrintOn:"]
-}),
-$globals.CharacterArray);
-
-
-$core.addMethod(
-$core.method({
-selector: "fromString:",
-protocol: "instance creation",
-fn: function (aString){
-var self=this,$self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-$self._subclassResponsibility();
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"fromString:",{aString:aString},$globals.CharacterArray.a$cls)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["aString"],
-source: "fromString: aString\x0a\x09self subclassResponsibility",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: ["subclassResponsibility"]
-}),
-$globals.CharacterArray.a$cls);
-
-
-$core.addClass("String", $globals.CharacterArray, [], "Kernel-Collections");
+$core.addClass("String", $globals.SequenceableCollection, [], "Kernel-Collections");
 //>>excludeStart("ide", pragmas.excludeIdeData);
 $globals.String.comment="I am an indexed collection of Characters. Unlike most Smalltalk dialects, Amber doesn't provide the Character class. Instead, elements of a String are single character strings.\x0a\x0aString inherits many useful methods from its hierarchy, such as\x0a\x09`Collection >> #,`";
 //>>excludeEnd("ide");
@@ -6220,6 +5817,30 @@ messageSends: []
 }),
 $globals.String);
 
+$core.addMethod(
+$core.method({
+selector: "add:",
+protocol: "adding/removing",
+fn: function (anObject){
+var self=this,$self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+$self._errorReadOnly();
+return self;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"add:",{anObject:anObject},$globals.String)});
+//>>excludeEnd("ctx");
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: ["anObject"],
+source: "add: anObject\x0a\x09self errorReadOnly",
+referencedClasses: [],
+//>>excludeEnd("ide");
+messageSends: ["errorReadOnly"]
+}),
+$globals.String);
+
 $core.addMethod(
 $core.method({
 selector: "asJavaScriptMethodName",
@@ -6426,6 +6047,37 @@ messageSends: []
 }),
 $globals.String);
 
+$core.addMethod(
+$core.method({
+selector: "asSymbolPrintOn:",
+protocol: "printing",
+fn: function (aStream){
+var self=this,$self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+var $1;
+$recv(aStream)._nextPutAll_("#");
+$1=$recv($self._asString())._isSelector();
+if($core.assert($1)){
+$recv(aStream)._nextPut_(self);
+} else {
+$self._printOn_(aStream);
+}
+return self;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"asSymbolPrintOn:",{aStream:aStream},$globals.String)});
+//>>excludeEnd("ctx");
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: ["aStream"],
+source: "asSymbolPrintOn: aStream\x0a\x09aStream nextPutAll: '#'.\x0a\x09self asString isSelector\x0a\x09\x09ifTrue: [ aStream nextPut: self ]\x0a\x09\x09ifFalse: [ self printOn: aStream ]",
+referencedClasses: [],
+//>>excludeEnd("ide");
+messageSends: ["nextPutAll:", "ifTrue:ifFalse:", "isSelector", "asString", "nextPut:", "printOn:"]
+}),
+$globals.String);
+
 $core.addMethod(
 $core.method({
 selector: "asUppercase",
@@ -6525,6 +6177,30 @@ messageSends: []
 }),
 $globals.String);
 
+$core.addMethod(
+$core.method({
+selector: "at:put:",
+protocol: "accessing",
+fn: function (anIndex,anObject){
+var self=this,$self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+$self._errorReadOnly();
+return self;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"at:put:",{anIndex:anIndex,anObject:anObject},$globals.String)});
+//>>excludeEnd("ctx");
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: ["anIndex", "anObject"],
+source: "at: anIndex put: anObject\x0a\x09self errorReadOnly",
+referencedClasses: [],
+//>>excludeEnd("ide");
+messageSends: ["errorReadOnly"]
+}),
+$globals.String);
+
 $core.addMethod(
 $core.method({
 selector: "capitalized",
@@ -6650,6 +6326,30 @@ messageSends: ["shallowCopy"]
 }),
 $globals.String);
 
+$core.addMethod(
+$core.method({
+selector: "errorReadOnly",
+protocol: "error handling",
+fn: function (){
+var self=this,$self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+$self._error_("Object is read-only");
+return self;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"errorReadOnly",{},$globals.String)});
+//>>excludeEnd("ctx");
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: [],
+source: "errorReadOnly\x0a\x09self error: 'Object is read-only'",
+referencedClasses: [],
+//>>excludeEnd("ide");
+messageSends: ["error:"]
+}),
+$globals.String);
+
 $core.addMethod(
 $core.method({
 selector: "escaped",
@@ -7254,6 +6954,78 @@ messageSends: ["nextPutAll:", "replace:with:"]
 }),
 $globals.String);
 
+$core.addMethod(
+$core.method({
+selector: "putOn:",
+protocol: "streaming",
+fn: function (aStream){
+var self=this,$self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+$recv(aStream)._nextPutString_(self);
+return self;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"putOn:",{aStream:aStream},$globals.String)});
+//>>excludeEnd("ctx");
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: ["aStream"],
+source: "putOn: aStream\x0a\x09aStream nextPutString: self",
+referencedClasses: [],
+//>>excludeEnd("ide");
+messageSends: ["nextPutString:"]
+}),
+$globals.String);
+
+$core.addMethod(
+$core.method({
+selector: "remove:",
+protocol: "adding/removing",
+fn: function (anObject){
+var self=this,$self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+$self._errorReadOnly();
+return self;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"remove:",{anObject:anObject},$globals.String)});
+//>>excludeEnd("ctx");
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: ["anObject"],
+source: "remove: anObject\x0a\x09self errorReadOnly",
+referencedClasses: [],
+//>>excludeEnd("ide");
+messageSends: ["errorReadOnly"]
+}),
+$globals.String);
+
+$core.addMethod(
+$core.method({
+selector: "remove:ifAbsent:",
+protocol: "adding/removing",
+fn: function (anObject,aBlock){
+var self=this,$self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+$self._errorReadOnly();
+return self;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"remove:ifAbsent:",{anObject:anObject,aBlock:aBlock},$globals.String)});
+//>>excludeEnd("ctx");
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: ["anObject", "aBlock"],
+source: "remove: anObject ifAbsent: aBlock\x0a\x09self errorReadOnly",
+referencedClasses: [],
+//>>excludeEnd("ide");
+messageSends: ["errorReadOnly"]
+}),
+$globals.String);
+
 $core.addMethod(
 $core.method({
 selector: "replace:with:",
@@ -7390,6 +7162,37 @@ messageSends: ["tokenize:"]
 }),
 $globals.String);
 
+$core.addMethod(
+$core.method({
+selector: "symbolPrintString",
+protocol: "printing",
+fn: function (){
+var self=this,$self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+return $recv($globals.String)._streamContents_((function(str){
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx2) {
+//>>excludeEnd("ctx");
+return $self._asSymbolPrintOn_(str);
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx2) {$ctx2.fillBlock({str:str},$ctx1,1)});
+//>>excludeEnd("ctx");
+}));
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"symbolPrintString",{},$globals.String)});
+//>>excludeEnd("ctx");
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: [],
+source: "symbolPrintString\x0a\x09^ String streamContents: [ :str | self asSymbolPrintOn: str ]",
+referencedClasses: ["String"],
+//>>excludeEnd("ide");
+messageSends: ["streamContents:", "asSymbolPrintOn:"]
+}),
+$globals.String);
+
 $core.addMethod(
 $core.method({
 selector: "tokenize:",

+ 42 - 90
lang/src/Kernel-Collections.st

@@ -1390,96 +1390,7 @@ withAll: aCollection
 	^ instance
 ! !
 
-SequenceableCollection subclass: #CharacterArray
-	instanceVariableNames: ''
-	package: 'Kernel-Collections'!
-!CharacterArray commentStamp!
-I am the abstract superclass of string-like collections.!
-
-!CharacterArray methodsFor: 'accessing'!
-
-at: anIndex put: anObject
-	self errorReadOnly
-! !
-
-!CharacterArray methodsFor: 'adding/removing'!
-
-add: anObject
-	self errorReadOnly
-!
-
-remove: anObject
-	self errorReadOnly
-!
-
-remove: anObject ifAbsent: aBlock
-	self errorReadOnly
-! !
-
-!CharacterArray methodsFor: 'converting'!
-
-asLowercase
-	^ self class fromString: self asString asLowercase
-!
-
-asNumber
-	^ self asString asNumber
-!
-
-asString
-	^ self subclassResponsibility
-!
-
-asSymbol
-	^ self asString
-!
-
-asUppercase
-	^ self class fromString: self asString asUppercase
-! !
-
-!CharacterArray methodsFor: 'copying'!
-
-, aString
-	^ self asString, aString asString
-! !
-
-!CharacterArray methodsFor: 'error handling'!
-
-errorReadOnly
-	self error: 'Object is read-only'
-! !
-
-!CharacterArray methodsFor: 'printing'!
-
-asSymbolPrintOn: aStream
-	aStream nextPutAll: '#'.
-	self asString isSelector
-		ifTrue: [ aStream nextPut: self ]
-		ifFalse: [ self printOn: aStream ]
-!
-
-printOn: aStream
-	self asString printOn: aStream
-!
-
-symbolPrintString
-	^ String streamContents: [ :str | self asSymbolPrintOn: str ]
-! !
-
-!CharacterArray methodsFor: 'streaming'!
-
-putOn: aStream
-	aStream nextPutString: self
-! !
-
-!CharacterArray class methodsFor: 'instance creation'!
-
-fromString: aString
-	self subclassResponsibility
-! !
-
-CharacterArray subclass: #String
+SequenceableCollection subclass: #String
 	instanceVariableNames: ''
 	package: 'Kernel-Collections'!
 !String commentStamp!
@@ -1505,6 +1416,10 @@ at: anIndex ifPresent: aBlock ifAbsent: anotherBlock
 	'>
 !
 
+at: anIndex put: anObject
+	self errorReadOnly
+!
+
 charCodeAt: anInteger
 	<inlineJS: 'return self.charCodeAt(anInteger - 1)'>
 !
@@ -1513,6 +1428,20 @@ size
 	<inlineJS: 'return self.length'>
 ! !
 
+!String methodsFor: 'adding/removing'!
+
+add: anObject
+	self errorReadOnly
+!
+
+remove: anObject
+	self errorReadOnly
+!
+
+remove: anObject ifAbsent: aBlock
+	self errorReadOnly
+! !
+
 !String methodsFor: 'comparing'!
 
 < aString
@@ -1649,6 +1578,12 @@ shallowCopy
 	^ self
 ! !
 
+!String methodsFor: 'error handling'!
+
+errorReadOnly
+	self error: 'Object is read-only'
+! !
+
 !String methodsFor: 'evaluating'!
 
 value: anObject 
@@ -1657,6 +1592,13 @@ value: anObject
 
 !String methodsFor: 'printing'!
 
+asSymbolPrintOn: aStream
+	aStream nextPutAll: '#'.
+	self asString isSelector
+		ifTrue: [ aStream nextPut: self ]
+		ifFalse: [ self printOn: aStream ]
+!
+
 printNl
 	<inlineJS: 'console.log(self)'>
 !
@@ -1666,6 +1608,10 @@ printOn: aStream
 		nextPutAll: '''';
 		nextPutAll: (self replace: '''' with: '''''');
 		nextPutAll: ''''
+!
+
+symbolPrintString
+	^ String streamContents: [ :str | self asSymbolPrintOn: str ]
 ! !
 
 !String methodsFor: 'private'!
@@ -1794,6 +1740,12 @@ tokenize: aString
 	<inlineJS: 'return self.split(aString)'>
 ! !
 
+!String methodsFor: 'streaming'!
+
+putOn: aStream
+	aStream nextPutString: self
+! !
+
 !String methodsFor: 'testing'!
 
 includesSubString: subString

+ 23 - 23
lang/src/Platform-DOM.js

@@ -116,29 +116,6 @@ messageSends: []
 }),
 $globals.PlatformDom.a$cls);
 
-$core.addMethod(
-$core.method({
-selector: "asDomNode",
-protocol: "*Platform-DOM",
-fn: function (){
-var self=this,$self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-return $recv(document)._createTextNode_($self._asString());
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"asDomNode",{},$globals.CharacterArray)});
-//>>excludeEnd("ctx");
-},
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "asDomNode\x0a\x09^ document createTextNode: self asString",
-referencedClasses: [],
-//>>excludeEnd("ide");
-messageSends: ["createTextNode:", "asString"]
-}),
-$globals.CharacterArray);
-
 $core.addMethod(
 $core.method({
 selector: "asDomNode",
@@ -211,6 +188,29 @@ messageSends: ["ifTrue:ifFalse:", "isDomNode:", "asDomNode"]
 }),
 $globals.JSObjectProxy);
 
+$core.addMethod(
+$core.method({
+selector: "asDomNode",
+protocol: "*Platform-DOM",
+fn: function (){
+var self=this,$self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+return $recv(document)._createTextNode_($self._asString());
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"asDomNode",{},$globals.String)});
+//>>excludeEnd("ctx");
+},
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: [],
+source: "asDomNode\x0a\x09^ document createTextNode: self asString",
+referencedClasses: [],
+//>>excludeEnd("ide");
+messageSends: ["createTextNode:", "asString"]
+}),
+$globals.String);
+
 $core.addMethod(
 $core.method({
 selector: "htmlTextContent",

+ 4 - 6
lang/src/Platform-DOM.st

@@ -40,12 +40,6 @@ isFeasible
 '>
 ! !
 
-!CharacterArray methodsFor: '*Platform-DOM'!
-
-asDomNode
-	^ document createTextNode: self asString
-! !
-
 !Collection methodsFor: '*Platform-DOM'!
 
 asDomNode
@@ -65,6 +59,10 @@ asDomNode
 
 !String methodsFor: '*Platform-DOM'!
 
+asDomNode
+	^ document createTextNode: self asString
+!
+
 htmlTextContent
 <inlineJS: 'var d=document.createElement("div");d.innerHTML=self;return d.textContent||d.innerText;'>
 ! !