#UI_ENHANCEMENT
authorClaus Gittinger <cg@exept.de>
Tue, 06 Oct 2015 18:25:49 +0200
changeset 6992 498b1d7e697e
parent 6991 8271065cb89a
child 6993 6eea4e9ccc2d
#UI_ENHANCEMENT class: ResourcePack changed: #readFromResourceStream:in: more walkback in case of errors
ResourcePack.st
--- a/ResourcePack.st	Tue Oct 06 17:44:06 2015 +0200
+++ b/ResourcePack.st	Tue Oct 06 18:25:49 2015 +0200
@@ -1386,17 +1386,17 @@
      printError fileName pushedSkipValues|
 
     fileName := (inStream isFileStream
-		    ifTrue:[inStream pathName asFilename baseName]
-		    ifFalse:['---']).
+                    ifTrue:[inStream pathName asFilename baseName]
+                    ifFalse:['---']).
 
     printError := [:message |
-		    'ResourcePack [warning]: ' errorPrint.
-		    message errorPrint.
-		    ' in file:' errorPrint.
-		    fileName errorPrint.
-		    ' line: ' errorPrint.
-		    lineNumber errorPrintCR
-		  ].
+                    'ResourcePack [warning]: ' errorPrint.
+                    message errorPrint.
+                    ' in file:' errorPrint.
+                    fileName errorPrint.
+                    ' line: ' errorPrint.
+                    lineNumber errorPrintCR
+                  ].
 
     printError := [:message | ].
 
@@ -1409,136 +1409,140 @@
     pushedSkipValues := OrderedCollection new.
 
     errorHandler := [:ex |
-			|con|
+                        |con|
 
-			Transcript showCR:('ResourcePack [warning]: ''' , ex description , '''') "errorPrintCR".
-			Transcript showCR:('ResourcePack [info]: file: ' , inStream pathName printString , ' line: ' , lineNumber printString , ': ''' , lineString , '''') "errorPrintCR".
-			con := ex suspendedContext.
-			Transcript showCR:('ResourcePack [info]: in: ' , con fullPrintString) "errorPrintCR".
-			con := con sender.
-			Transcript showCR:('ResourcePack [info]:   : ' , con fullPrintString) "errorPrintCR".
-			con := con sender.
-			Transcript showCR:('ResourcePack [info]:   : ' , con fullPrintString) "errorPrintCR".
-			value := nil.
-			ok := false.
-		    ].
+                        Transcript showCR:('ResourcePack [warning]: ''' , ex description , '''') "errorPrintCR".
+                        Transcript showCR:('ResourcePack [info]: file: ' , inStream pathName printString , ' line: ' , lineNumber printString , ': ''' , lineString , '''') "errorPrintCR".
+                        con := ex suspendedContext.
+                        Transcript showCR:('ResourcePack [info]: in: ' , con fullPrintString) "errorPrintCR".
+                        con := con sender.
+                        Transcript showCR:('ResourcePack [info]:   : ' , con fullPrintString) "errorPrintCR".
+                        20 timesRepeat:[
+                            con notNil ifTrue:[
+                                con := con sender.
+                                Transcript showCR:('ResourcePack [info]:   : ' , con fullPrintString) "errorPrintCR".
+                            ].
+                        ].    
+                        value := nil.
+                        ok := false.
+                    ].
 
     [inStream atEnd] whileFalse:[
-	lineString := inStream nextLine. lineNumber := lineNumber + 1.
-	[lineString notNil and:[lineString endsWith:$\]] whileTrue:[
-	    lineString := lineString copyButLast:1.
-	    l := inStream nextLine. lineNumber := lineNumber + 1.
-	    l notNil ifTrue:[
-		lineString := lineString , l.
-	    ].
-	].
+        lineString := inStream nextLine. lineNumber := lineNumber + 1.
+        [lineString notNil and:[lineString endsWith:$\]] whileTrue:[
+            lineString := lineString copyButLast:1.
+            l := inStream nextLine. lineNumber := lineNumber + 1.
+            l notNil ifTrue:[
+                lineString := lineString , l.
+            ].
+        ].
 
-	(lineString size > 0) ifTrue:[
-	    first := lineString at:1.
-	    "/
-	    "/ for your convenience: treat both ';' AND '"/' as comment-line
-	    "/
-	    ((first == $;) or:[lineString startsWith:'"/']) ifFalse:[
-		((first == $#) and:[(lineString startsWith:'#(') not]) ifTrue:[
-		    "/ a directive
-		    lineString := (lineString copyFrom:2) withoutSpaces.
+        (lineString size > 0) ifTrue:[
+            first := lineString at:1.
+            "/
+            "/ for your convenience: treat both ';' AND '"/' as comment-line
+            "/
+            ((first == $;) or:[lineString startsWith:'"/']) ifFalse:[
+                ((first == $#) and:[(lineString startsWith:'#(') not]) ifTrue:[
+                    "/ a directive
+                    lineString := (lineString copyFrom:2) withoutSpaces.
 
-		    (lineString startsWith:'if') ifTrue:[
-			pushedSkipValues add:skipping.
-			skipping ifFalse:[
-			    rest := lineString copyFrom:3.
-			    Error, UserInformation
-				handle:errorHandler
-				do:[
-				    value := Compiler evaluate:rest compile:false.
-				].
-			    (value == #Error) ifTrue:[
-				printError value:('error in resource:' , lineString).
-			    ].
-			    (value == false) ifTrue:[
-				skipping := true
-			    ]
-			].
-			ifLevel := ifLevel + 1
-		    ] ifFalse:[
-			(lineString startsWith:'endif') ifTrue:[
-			    ifLevel == 0 ifTrue:[
-				printError value:('if/endif nesting error').
-			    ] ifFalse:[
-				ifLevel := ifLevel - 1.
-				skipping := pushedSkipValues removeLast.
-			    ]
-			] ifFalse:[
-			    (lineString startsWith:'else') ifTrue:[
-				(pushedSkipValues includes:true) ifFalse:[
-				    skipping := skipping not
-				]
-			    ] ifFalse:[
-				skipping ifFalse:[
-				    (lineString startsWith:'superpack') ifTrue:[
-					rest := lineString copyFrom:('superpack' size + 1).
-					value := Compiler evaluate:rest compile:false.
-					(value isKindOf:ResourcePack) ifTrue:[
-					    superPack := value
-					]
-				    ] ifFalse:[
-					(lineString startsWith:'include') ifTrue:[
-					    (lineString startsWith:'includeResourcesFor') ifTrue:[
-						"/ include those resources ...
-						rest := lineString copyFrom:('includeResourcesFor' size + 1).
-						value := Compiler evaluate:rest compile:false.
-						value isBehavior ifTrue:[
-						    pack := self class for:value.
-						    pack notNil ifTrue:[
-							self addAll:pack.
-						    ]
-						]
-					    ] ifFalse:[
-						rest := lineString copyFrom:('include' size + 1).
-						value := Compiler evaluate:rest compile:false.
-						value isString ifFalse:[
-						    printError value:('bad include filename: ' , value printString, ' "',lineString,'"').
-						] ifTrue:[
-						    self readFromFile:value directory:dirName
-						]
-					    ]
-					] ifFalse:[
-					    (lineString startsWith:'encoding') ifTrue:[
+                    (lineString startsWith:'if') ifTrue:[
+                        pushedSkipValues add:skipping.
+                        skipping ifFalse:[
+                            rest := lineString copyFrom:3.
+                            Error, UserInformation
+                                handle:errorHandler
+                                do:[
+                                    value := Compiler evaluate:rest compile:false.
+                                ].
+                            (value == #Error) ifTrue:[
+                                printError value:('error in resource:' , lineString).
+                            ].
+                            (value == false) ifTrue:[
+                                skipping := true
+                            ]
+                        ].
+                        ifLevel := ifLevel + 1
+                    ] ifFalse:[
+                        (lineString startsWith:'endif') ifTrue:[
+                            ifLevel == 0 ifTrue:[
+                                printError value:('if/endif nesting error').
+                            ] ifFalse:[
+                                ifLevel := ifLevel - 1.
+                                skipping := pushedSkipValues removeLast.
+                            ]
+                        ] ifFalse:[
+                            (lineString startsWith:'else') ifTrue:[
+                                (pushedSkipValues includes:true) ifFalse:[
+                                    skipping := skipping not
+                                ]
+                            ] ifFalse:[
+                                skipping ifFalse:[
+                                    (lineString startsWith:'superpack') ifTrue:[
+                                        rest := lineString copyFrom:('superpack' size + 1).
+                                        value := Compiler evaluate:rest compile:false.
+                                        (value isKindOf:ResourcePack) ifTrue:[
+                                            superPack := value
+                                        ]
+                                    ] ifFalse:[
+                                        (lineString startsWith:'include') ifTrue:[
+                                            (lineString startsWith:'includeResourcesFor') ifTrue:[
+                                                "/ include those resources ...
+                                                rest := lineString copyFrom:('includeResourcesFor' size + 1).
+                                                value := Compiler evaluate:rest compile:false.
+                                                value isBehavior ifTrue:[
+                                                    pack := self class for:value.
+                                                    pack notNil ifTrue:[
+                                                        self addAll:pack.
+                                                    ]
+                                                ]
+                                            ] ifFalse:[
+                                                rest := lineString copyFrom:('include' size + 1).
+                                                value := Compiler evaluate:rest compile:false.
+                                                value isString ifFalse:[
+                                                    printError value:('bad include filename: ' , value printString, ' "',lineString,'"').
+                                                ] ifTrue:[
+                                                    self readFromFile:value directory:dirName
+                                                ]
+                                            ]
+                                        ] ifFalse:[
+                                            (lineString startsWith:'encoding') ifTrue:[
 "/decoder notNil ifTrue:[self halt:'oops - encoding change in file'].
-						encoding := self class extractEncodingFromLine:lineString.
-						decoder := CharacterEncoder encoderFor:encoding ifAbsent:nil.
-					    ]
-					]
-				    ]
-				]
-			    ]
-			]
-		    ].
-		] ifFalse:[
-		    skipping ifFalse:[
-			Error, UserInformation
-			    handle:errorHandler
-			    do:[
-				(lineString at:1) == $!! ifTrue:[
-				    "/ evaluate the rest
-				    Compiler evaluate:(lineString copyFrom:2)
-						      receiver:self
-						      notifying:nil
-						      compile:false.
-				] ifFalse:[
-				    "/ process as resource
-				    self
-					processLine:lineString
-					encoding:decoder
-					file:(inStream isFileStream
-						ifTrue:[inStream pathName]
-						ifFalse:['---'])
-					printErrorWith:printError
-				]]
-		    ]
-		]
-	    ]
-	]
+                                                encoding := self class extractEncodingFromLine:lineString.
+                                                decoder := CharacterEncoder encoderFor:encoding ifAbsent:nil.
+                                            ]
+                                        ]
+                                    ]
+                                ]
+                            ]
+                        ]
+                    ].
+                ] ifFalse:[
+                    skipping ifFalse:[
+                        Error, UserInformation
+                            handle:errorHandler
+                            do:[
+                                (lineString at:1) == $!! ifTrue:[
+                                    "/ evaluate the rest
+                                    Compiler evaluate:(lineString copyFrom:2)
+                                                      receiver:self
+                                                      notifying:nil
+                                                      compile:false.
+                                ] ifFalse:[
+                                    "/ process as resource
+                                    self
+                                        processLine:lineString
+                                        encoding:decoder
+                                        file:(inStream isFileStream
+                                                ifTrue:[inStream pathName]
+                                                ifFalse:['---'])
+                                        printErrorWith:printError
+                                ]]
+                    ]
+                ]
+            ]
+        ]
     ].
     ^ ok