[e-cvs] cvs commit: e/src/esrc/scripts eBrowser.e

markm@eros.cs.jhu.edu markm@eros.cs.jhu.edu
Tue, 4 Sep 2001 06:45:04 -0400


markm       01/09/04 06:45:03

  Modified:    src/esrc/scripts eBrowser.e
  Added:       src/esrc/org/erights/e/elang/cmd evalServerMakerAuthor.updoc
               src/esrc/org/erights/e/tools/text abbrev.emaker
               src/esrc/org/erights/ex/swing textSelectorMaker.emaker
  Log:
  good highlighting of syntax errors

Revision  Changes    Path
1.1                  e/src/esrc/org/erights/e/elang/cmd/evalServerMakerAuthor.updoc

Index: evalServerMakerAuthor.updoc
===================================================================
    ? def cmd__uriGetter := <import:org.erights.e.elang.cmd.*>
    # value: <import:org.erights.e.elang.cmd.*>
    
    ? def evalServerMaker := <cmd:evalServerMakerAuthor>(unsafe__uriGetter, introducer, println)
    # value: <evalServerMaker>
    
    ? introducer onTheAir()
    # value: ["3DES_SDH_M2", "3DES_SDH_M"]
    
    ? def vat := evalServerMaker new(["foo", "bar"], interp getProps(), "Test Vat2")
    made interp
    about to readLine
    read cap://192.168.0.21:1040/GkLGvmjQmP_7a8AQDs8=2oUUfYK/0CkFeF5eS7GeRmv=SgAXBQe=sATX
    # value: <vat>
    
    ? def evalServerRcvr := vat getEvalServerRcvr()
    # value: <Eventual ref>
    
    ? def seRcvr := evalServerRcvr <- newScriptEvaluator(["zip", "zap"])
    # value: <Eventual ref>
    
    ? def reportVow := seRcvr <- evalCmdVow("2 + 3")
    # value: <Eventual ref>
    
    ? reportVow
    # value: "# valuex: 5\n\
    #        \n\
    #        "
    
    ? 


1.1                  e/src/esrc/org/erights/e/tools/text/abbrev.emaker

Index: abbrev.emaker
===================================================================
# Fits str into one line and inside budget

def abbrev(var str :Twine, budget :integer) :Twine {
    str := str replaceAll("\n", " ")
    str := str replaceAll("\r", " ")
    str := str replaceAll("\t", " ")
    def len := str size()
    if (len <= budget) {
        str
    } else {
        def segLen := budget _/ 2 - 1
		def restLen := budget - segLen - 3
        str(0,segLen) + "..." + str(len - restLen, len)
    }
}



1.1                  e/src/esrc/org/erights/ex/swing/textSelectorMaker.emaker

Index: textSelectorMaker.emaker
===================================================================

# Makes a textSelector for selecting text in a given textPane representing a given url.
# <p>
# XXX now we need something which will find and open a textPane given a url.
#
# @author Mark S. Miller

class textSelectorMaker(textPane, paneUrl) :any {
    def textSelector {
        
        # If optTwine isn't null, and it's not bare, and the urls match, then select
        # that span in the textPane, grab the focus, and pop to the top.
        # <p>
        # XXX Todo: if optTwine is discontiguous, select discontiguous spans.
        #
        # @return Whether selection happened.
        
        to selectSpan(optTwine) :boolean {
            escape return {
                if (optTwine == null) {
                    return(false)
                }
                def optSpan := optTwine optSourceSpan()
                if (optSpan == null) {
                    return(false)
                }
                def url := optSpan getUrl()
                if (url != paneUrl) {
                    return(false)
                }
                # "-1" because getLineStartOffset is 0 index origin
                def line1pos := textPane getLineStartOffset(optSpan getStartLine() -1)
                textPane setCaretPosition(line1pos + optSpan getStartCol())
                def line2pos := textPane getLineStartOffset(optSpan getEndLine() -1)
                textPane moveCaretPosition(line2pos + optSpan getEndCol() +1)
                
                textPane requestFocus()
                textPane getTopLevelAncestor() toFront()
                true
            }
        }
    }
}




1.37      +63 -67    e/src/esrc/scripts/eBrowser.e

Index: eBrowser.e
===================================================================
RCS file: /cvs/e/src/esrc/scripts/eBrowser.e,v
retrieving revision 1.36
retrieving revision 1.37
diff -u -r1.36 -r1.37
--- eBrowser.e	2001/09/03 18:20:18	1.36
+++ eBrowser.e	2001/09/04 10:45:03	1.37
@@ -40,6 +40,19 @@
     swing__uriGetter,
     JPanel__quasiParser,
     JFrameMaker)
+
+def StringReaderMaker := <unsafe:java.io.StringReader>
+
+def textSelectorMaker := <import:org.erights.ex.swing.textSelectorMaker>
+def abbrev := <import:org.erights.e.tools.text.abbrev>
+
+def SyntaxException :=
+  <unsafe:org.erights.e.elang.syntax.SyntaxException> asType()
+
+def PrettyFeeder := <unsafe:org.erights.e.elang.syntax.PrettyFeeder>
+
+
+
 # set up tracing; stub out all the printing for operational version
 def traceln(str) { println(str) }
 traceln("started")
@@ -142,15 +155,6 @@
     textPane addKeyListener(keyListener)
 }
 
-def PrettyFeeder := <unsafe:org.erights.e.elang.syntax.PrettyFeeder>
-
-# Indentation formatter
-def prettyE(eText,tab) :pbc {
-    # XXX todo: if tab isn't four spaces, replace each initial four spaces
-    # with it, except within quoted strings.
-    PrettyFeeder pretty(eText)
-}
-
 def openFiles := [] asMap() diverge()
 
 # the frame argument is sacrificial
@@ -276,24 +280,32 @@
     interpret()
 }
 
-# Assumes without checking that the span is into the same "file" shown
-# in this textPane
 
-def selectSpan(textPane, span) {
-    # "-1" because getLineStartOffset is 0 index origin
-    def line1pos := textPane getLineStartOffset(span getStartLine() -1)
-    textPane setCaretPosition(line1pos + span getStartCol())
-    def line2pos := textPane getLineStartOffset(span getEndLine() -1)
-    textPane moveCaretPosition(line2pos + span getEndCol())
+class problemReporterMaker(textSelector, resultPane, statusPane) :any {
+    def problemReporter(problem) {
+        resultPane setText(("\n" + problem) replaceAll("\n", "\n# "))
+        var msg := (""+problem) split("\n")[0] trim()
+        if (msg endsWith(":")) {
+            msg := msg(0, msg size() -1)
+        }
+        statusPane setText(msg)
+        statusPane repaint()
+        if (problem leaf() =~ sex :SyntaxException) {
+            textSelector selectSpan(sex optDamage())
+        } else {
+            def stacktrace := "\n\n" + problem eStack() + "\n\n" +
+              problem leaf() javaStack()
+            resultPane append(stacktrace replaceAll("\n", "\n# "))
+        }
+    }
 }
-
-
-def SyntaxException :=
-  <unsafe:org.erights.e.elang.syntax.SyntaxException> asType()
 
-def programRunner(sourceTwine, textPane, textModel, resultPane) {
+def programRunner(sourceTwine, textPane, textModel, resultPane, statusPane) {
     resultPane setText("Executing...")
     traceln("in runner, about to interpret")
+    def path := textModel getFilePath()
+    def textSelector := textSelectorMaker new(textPane, `file:$path`)
+    def problemReporter := problemReporterMaker new(textSelector, resultPane, statusPane)
     def interpret() {
         traceln("ready")
         def ScopeSetupMaker := <unsafe:org.erights.e.elang.interp.ScopeSetup>
@@ -310,6 +322,10 @@
             to continueAtTop() {
                 # ignored
             }
+            to getArgs() :any {
+                # XXX put settable args here
+                []
+            }
             delegate { interp }
         }
         traceln("made subInterp")
@@ -324,33 +340,7 @@
             traceln("shown")
             
         } catch problem {
-            resultPane append(("\n" + problem) replaceAll("\n", "\n# "))
-            if (problem leaf() =~ sex :SyntaxException) {
-                def optDamage := sex optDamage()
-                if (optDamage != null) {
-                    def optSpan := optDamage optSourceSpan()
-                    if (optSpan != null) {
-                        def url := optSpan getUrl()
-                        def path := textModel getFilePath()
-                        if (url =~ `file:$path`) {
-                            traceln(`position to $optSpan in "$optDamage"`)
-                            selectSpan(textPane, optSpan)
-                            textPane requestFocus()
-                            textPane getTopLevelAncestor() toFront()
-                        } else {
-                            traceln(`$url !~ ``file:$path```)
-                        }
-                    } else {
-                        traceln("string is bare")
-                    }
-                } else {
-                    traceln("floating syntax exception")
-                }
-            } else {
-                resultPane append(("\n\n" + problem eStack() + "\n\n" +
-                                     problem javaStack()) replaceAll("\n", "\n# "))
-            }
-            traceln("problem shown")
+            problemReporter(problem)
         }
         
     }
@@ -739,7 +729,7 @@
     }
     
     #make the menus
-    def mm := <import:com.skyhunter.ex.swing.menuMakerAuthor> (
+    def mm := <import:com.skyhunter.ex.swing.menuMakerAuthor>(
         swing__uriGetter,
         <unsafe:org.erights.e.ui.jed.EAction>,
         menuReactor)
@@ -803,6 +793,15 @@
     
     startOutlineSyncer(farBrowseServerMaker <- new(), textModel, textPane)
     
+    def path := textModel getFilePath()
+    def textSelector := textSelectorMaker new(textPane, `file:$path`)
+    def problemReporter := problemReporterMaker new(textSelector, outputPane, statusPane)
+    
+    def getTwine() :Twine {
+        def reader := StringReaderMaker new(textPane getText())
+        reader getTwine(`file:$path`)
+    }
+    
     def bind eBrowser {
         to save() {
             if (textModel saveFileIsSet()) {
@@ -857,23 +856,15 @@
         to scratchpad() {elmer()}
         to executeHiLite() {
             outputPane setText("")
-            def str := textPane getText()
-            def reader := <unsafe:java.io.StringReader> new(str)
-            def path := textModel getFilePath()
-            def twine := reader getTwine(`file:$path`)
-            def selection := twine(textPane getSelectionStart(),
-                                   textPane getSelectionEnd())
+            def selection := getTwine()(textPane getSelectionStart(),
+                                        textPane getSelectionEnd())
             traceln(`Selection: "$selection"`)
-            programRunner(selection, textPane, textModel, outputPane)
+            programRunner(selection, textPane, textModel, outputPane, statusPane)
             # programRunner(textPane getSelectedText(),"",outputPane)
         }
         to executeProgram() {
             outputPane setText("")
-            def str := textPane getText()
-            def reader := <unsafe:java.io.StringReader> new(str)
-            def path := textModel getFilePath()
-            def twine := reader getTwine(`file:$path`)
-            programRunner(twine, textPane, textModel, outputPane)
+            programRunner(getTwine(), textPane, textModel, outputPane, statusPane)
         }
         to insertVar() {
             def insert := "" + varListPane getSelectedValue()
@@ -939,10 +930,15 @@
         to reformat() {
             textPane setEditable(false)
             eBrowser setStatus("Reformatting...")
-            textPane setText(prettyE(textPane getText(), tabValue))
-            println(`did textPane setText`)
-            textPane setEditable(true)
-            eBrowser setStatus("Reformat Done.")
+            try {
+                textPane setText(PrettyFeeder pretty(getTwine()))
+                textPane setEditable(true)
+                eBrowser setStatus("Reformat Done.")
+                textPane setEditable(true)
+            } catch problem {
+                textPane setEditable(true)
+                problemReporter(problem)
+            }
         }
         to linesChanged() {
             configureUpdatedListPane(funcListPane, textModel getOutlineList())
@@ -1038,7 +1034,7 @@
 # newest version put sync server in separate vat, same jvm
 def makeFarSyncServer() {
     introducer onTheAir()
-    def vatMaker := <import:com.skyhunter.e.lang.vatMakerAuthor> run(
+    def vatMaker := <import:com.skyhunter.e.lang.vatMakerAuthor>(
         unsafe__uriGetter, introducer, println)
     def source := "<import:com.skyhunter.eBrowser.syncServerMakerAuthor> run(unsafe__uriGetter, stdout)"
     def vat := vatMaker new(source, [], interp getProps(), "Sync Server Maker")