[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")