Changeset 827


Ignore:
Timestamp:
Aug 6, 2012 4:50:46 PM (12 years ago)
Author:
biz002
Message:

clojure/rascal integration consistency; rascal data pgf-based printer

RascalPp test case

make reval and rcall more consistent in clojure api;
both now return a value rather than a result

some addressing of the issue of VoidResult toString (in Rascal)
throwing a null pointer exception

rcall fix (clojure api)

try pgf based pp and groupings with large (magnolia ast) data structures

some clojure api cleanup

Location:
trunk/magnolia-eclipse
Files:
2 added
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/magnolia-eclipse/src/org/magnolialang/pgf/FmtUtil.rsc

    r792 r827  
    8888}
    8989
     90/*
    9091public void main(list[str] args) {
    9192  println(cat("forever {", indent(2), br, "(void)0;", dedent, br, "}"));
    9293}
     94*/
  • trunk/magnolia-eclipse/src/org/magnolialang/pgf/Groupings.rsc

    r824 r827  
    2121}
    2222
     23tuple[value, Tseq] nil_accept_f(value v, Tseq s, str name) {
     24  return <v, NilTseq()>;
     25}
     26
    2327Tseq nil_end_f(value v) {
    2428  return NilTseq();
     
    2630
    2731public Grouping newGrouping(str name) {
    28   return Grouping(name, nil_begin_f, nil_put_f, nil_put_f,
     32  return Grouping(name, nil_begin_f, nil_put_f, nil_accept_f,
    2933                  nil_end_f, grpEofDefault);
    3034}
     
    3842}
    3943
     44tuple[value, Tseq] tseq_accept_f(value v, Tseq s, str name) {
     45  return <tseq(v, s), NilTseq()>;
     46}
     47
    4048Grouping makeGroup() {
    4149  Grouping g = newGrouping("group");
    4250  g.begin = tseq_begin_f;
    4351  g.put = tseq_put_f;
    44   g.accept = tseq_put_f;
     52  g.accept = tseq_accept_f;
    4553  // cannot use 'group' directly as it's an overload;
    4654  // must resolve the overload here
  • trunk/magnolia-eclipse/src/org/magnolialang/pgf/Token.rsc

    r824 r827  
    6868
    6969Token eofTok = Eof();
    70 Tseq nilSeq = NilTseq();
     70
     71public Tseq nilTseq = NilTseq();
    7172
    7273public Tseq emptyTseq() {
    73   return nilSeq;
     74  return nilTseq;
    7475}
    7576
     
    129130public default tuple[Token, Tseq] tseqGet(x) {
    130131  switch (x) {
    131   case Token t: return <t, nilSeq>;
    132   case str s: return <Text(s), nilSeq>;
    133   case NilTseq(): return <eofTok, nilSeq>;
     132  case Token t: return <t, nilTseq>;
     133  case str s: return <Text(s), nilTseq>;
     134  case NilTseq(): return <eofTok, nilTseq>;
    134135  case ListTseq(lst): return tseqGetList(lst);
    135136  case list[value] lst: return tseqGetList(lst);
    136137  case LazyTseq(_, _): return tseqGetLazy(x);
    137   case false: return <eofTok, nilSeq>;
     138  case false: return <eofTok, nilTseq>;
    138139  default:
    139140    throw "attempt to tseqGet from unsupported value <x>";
     
    152153    i += 1;
    153154  }
    154   return <eofTok, nilSeq>;
     155  return <eofTok, nilTseq>;
    155156}
    156157
     
    181182// deprecated (use emptyTseq)
    182183public Tseq newTokenStream() {
    183   return nilSeq;
     184  return nilTseq;
    184185}
    185186
  • trunk/magnolia-eclipse/src/org/magnolialang/pgf/engines/FmtEngine.rsc

    r824 r827  
    9696             value () begin,
    9797             tuple[value, Tseq] (value, Token) put,
    98              tuple[value, Tseq] (value, Token) accept,
     98             tuple[value, Tseq] (value, Tseq, str) accept,
    9999             Tseq (value) end,
    100100             void (value, str) eof
     
    154154    g_st = tg.st;
    155155    <n_g_st, r> = g_type.accept(g_st, s, name);
    156     n_grp = GrpSt(tg, n_g_st);
     156    n_grp = GrpSt(g_type, n_g_st);
    157157    n_st = FmtSt(st.cw, st.w, st.outDoc, st.inDoc,
    158158                 st.k, st.lvStack, st.i, st.bt,
     
    306306public FmtSt newFmtSt(int w) {
    307307  return newFmtSt(w, emptyTseq());
     308}
     309
     310public FmtSt newFmtSt() {
     311  return newFmtSt(80);
    308312}
    309313
     
    442446
    443447// Adds a token to input.
    444 public FmtSt put(FmtSt st, Token t) {
     448public FmtSt write(FmtSt st, Token t) {
    445449  return write(st, tseq(t));
    446450}
     
    486490}
    487491
     492// st: pretty printing state
     493public str pretty(FmtSt st) {
     494  st = flush(drive(st));
     495  return docToString(st.outDoc);
     496}
     497
    488498// w: output line width
    489499// ts: a (complete) input document
    490500public str pretty(int w, Tseq ts) {
    491501  FmtSt st = newFmtSt(w, ts);
    492   st = flush(drive(st));
    493   return docToString(st.outDoc);
     502  return pretty(st);
    494503}
    495504
     
    526535public FmtSt prettyPrintFlush(FmtSt st) {
    527536  return printBuffered(flush(prettyPrint(st)));
     537}
     538
     539public FmtSt prettyPrintFlushLn(FmtSt st) {
     540  st = prettyPrintFlush(st);
     541  println("");
     542  return st;
    528543}
    529544
  • trunk/magnolia-eclipse/src/org/magnolialang/pgf/tests/TestFmtEngine.rsc

    r824 r827  
    11// run with rascal-src
     2
     3/*
     4  (rimport "org::magnolialang::pgf::tests::TestFmtEngine")
     5  (rcall "runTestFmtEngine")
     6 */
    27module org::magnolialang::pgf::tests::TestFmtEngine
    38
  • trunk/magnolia-eclipse/src/org/magnolialang/testutil/RascalEval.java

    r808 r827  
    3333import org.rascalmpl.values.uptr.Factory;
    3434import org.rascalmpl.values.uptr.TreeAdapter;
     35
     36/*
     37 * Calling toString() on a VoidResult gives a NullPointerException,
     38 * which can cause trouble here and there.
     39 * This is a more polite implementation.
     40 *
     41 * public class VoidResult extends Result<VoidResult.Void> {
     42 * abstract class Void implements IValue {}
     43 *
     44 * public VoidResult(Type type, IEvaluatorContext ctx) {
     45 * super(type, null, ctx);
     46 * }
     47 *
     48 * public String toString() {
     49 * return getType().toString();
     50 * }
     51 *
     52 * public String toString(int length) {
     53 * return toString();
     54 * }
     55 * }
     56 */
    3557
    3658public class RascalEval {
     
    83105        public IValue call(String name, Collection<IValue> args) {
    84106                //System.err.println("call " + name + " with " + args);
    85                 return evaluator.call(name, args.toArray(new IValue[] {}));
     107                IValue[] arr = new IValue[] {};
     108                if(args != null)
     109                        arr = args.toArray(arr);
     110                return evaluator.call(name, arr);
    86111        }
    87112
     
    99124
    100125        public static String resultToString(Result<IValue> value) {
    101                 if(value.getValue() == null) {
     126                IValue v = value.getValue();
     127                Type type = value.getType();
     128
     129                if(v == null || type == null) {
    102130                        return "ok";
    103131                }
    104132
    105                 IValue v = value.getValue();
    106                 Type type = value.getType();
     133                // Calling Result<IValue>.toString should be safe if both getValue
     134                // and getType yield non-null.
     135                String s = value.toString(LINE_LIMIT);
    107136
    108137                if(type.isAbstractDataType() && type.isSubtypeOf(Factory.Tree)) {
    109                         return "`" + TreeAdapter.yield((IConstructor) v) + "`\n" + value.toString(LINE_LIMIT);
     138                        return "`" + TreeAdapter.yield((IConstructor) v) + "`\n" + s;
    110139                }
    111140
    112                 return ((v != null) ? value.toString(LINE_LIMIT) : null);
     141                return s;
    113142        }
    114143
  • trunk/magnolia-eclipse/src/org/magnolialang/testutil/TestUtil.rsc

    r822 r827  
    11module org::magnolialang::testutil::TestUtil
    2 
    3 import org::magnolialang::pgf::PrettyParseTree;
    4 import org::magnolialang::pgf::Token;
    52
    63import org::magnolialang::magnolia::MagnoliaFacts;
     
    118import List;
    129
    13 /** Dumps test data (token streams of Magnolia) as Rascal data
    14     structures. */
    15 public Tseq mgModuleToTokens(str modName) {
    16   name = strToName(modName);
    17   tr = startTransaction();
    18   //println(getFact(tr, #DefInfo, name));
    19   pt = getFact(tr, #ParseTree, name).val;
    20   //println(pt);
    21   ts = prettyParseTree(emptyTseq(), pt);
    22   //println(ts);
    23   endTransaction(tr);
    24   return ts;
     10@doc{Call Java toString to turn a Rascal value into a string.}
     11@javaClass{org.magnolialang.testutil.RascalExt}
     12public java str javaToString(value v);
     13
     14@doc{Converts tuple field values to a list.}
     15@javaClass{org.magnolialang.testutil.RascalExt}
     16public java list[value] tupleToList(value tp);
     17
     18public void makeVoidResult() {
    2519}
     20
     21public int makeIntResult() {
     22  return 1;
     23}
     24
     25public int incIntResult(int x) {
     26  return x + 1;
     27}
  • trunk/magnolia-eclipse/src/org/magnolialang/testutil/core.clj

    r825 r827  
    7777  (def rsc-evaluator (get-ric)))
    7878       
    79 (defn rtostring [r]
     79(defn result-to-string [r]
    8080  (RascalEval/resultToString r))
    8181
     
    8383;; E.g. (reval "registerCompiler")
    8484(defn reval [s]
    85   (.eval rsc-evaluator s))
    86 
    87 ;; Behaves better upon VoidResult.
     85  (.getValue (.eval rsc-evaluator s)))
     86
    8887(defn reval-str [s]
    89   (rtostring (reval s)))
     88  (result-to-string (.eval rsc-evaluator s)))
    9089
    9190;; E.g. (reval-more "import org::magnolialang::tasks::Manager; getFact; 5;")
    9291(defn reval-more [s]
    93   (.evalMore rsc-evaluator s))
     92  (.getValue (.evalMore rsc-evaluator s)))
    9493
    9594(defn reval-more-str [s]
    96   (rtostring (.evalMore rsc-evaluator s)))
     95  (result-to-string (.evalMore rsc-evaluator s)))
    9796
    9897;; E.g. (rimport "org::magnolialang::tasks::Manager")
     
    107106
    108107;; This produces VoidResult, which
    109 ;; org.rascalmpl.interpreter.result.Result.toString dislikes.
    110 ;; E.g. (rtostring (make-rvoid))
    111 (defn make-rvoid []
    112   (reval-more ";"))
     108;; org.rascalmpl.interpreter.result.Result.toString dislikes
     109;; (unless using a patched version of VoidResult).
     110;; E.g. (result-to-string (make-rvoid))
     111(defn make-void-result []
     112  (.evalMore rsc-evaluator ";"))
    113113
    114114;; For reloading Rascal modules individually.
     
    134134    (.initialize parser))
    135135  (def rsc-evaluator (get-ric))
    136   (rimport "org::magnolialang::testutil::TestUtil"))
     136  (rimport "org::magnolialang::testutil::TestUtil")
     137  )
    137138
    138139(defn get-parser [s]
     
    172173
    173174(defn get-imploded-tree [s]
    174   (let [state tu-state
    175         lang mg-lang
    176         modNameAst (.getNameAST lang s)]
    177     (.getImplodedTree state modNameAst)))
     175  (.getImplodedTree tu-state (get-name-ast s)))
    178176
    179177(defn rstring [s]
     
    183181  (.bool org.magnolialang.terms.TermFactory/vf b))
    184182
     183(defn rinteger [i]
     184  ;; has other overloads
     185  (.integer org.magnolialang.terms.TermFactory/vf i))
     186
     187(defn rprint [v annos?]
     188  (println (.getValue (rcall "prettyRascalValue" v (rbool annos?)))))
     189
     190(defn rtostring [v]
     191  (.getValue (rcall "javaToString" v)))
     192
    185193(defn get-option-string-fact [s]
    186   (let [state tu-state]
    187     (.getOptionStringFact state (rstring s))))
    188 
    189 (defn mg-module-to-tokens [s]
    190   (rcall "mgModuleToTokens" (rstring s)))
     194  (.getOptionStringFact tu-state (rstring s)))
    191195
    192196(defn get-fact [type name]
    193   (.getFact tu-state
    194             type name))
    195 
    196 (defn get-def-info [s]
    197   (get-fact MagnoliaFacts/Type_DefInfo
    198             (get-name-ast s)))
    199 
    200 (defn get-flattened [s]
     197  (.getFact tu-state type name))
     198
     199(defn get-fact-imploded-tree [s]
     200  (get-fact MagnoliaFacts/Type_ImplodedTree (get-name-ast s)))
     201
     202(defn get-fact-flattened [s]
    201203  (get-fact MagnoliaFacts/Type_Flattened (get-name-ast s)))
    202204
    203 (defn get-contents [s]
     205(defn get-fact-type-checked [s]
     206  (get-fact MagnoliaFacts/Type_TypeChecked (get-name-ast s)))
     207
     208(defn get-fact-def-info [s]
     209  (get-fact MagnoliaFacts/Type_DefInfo (get-name-ast s)))
     210
     211(defn get-fact-contents [s]
    204212  (get-fact MagnoliaFacts/Type_Contents (get-name-ast s)))
    205213
    206 (defn get-type-checked [s]
    207   (get-fact MagnoliaFacts/Type_TypeChecked (get-name-ast s)))
    208 
    209214;; E.g. (doseq [x (get-contents-seq "basic.Basic")]
    210 ;;        (prn (ctor-get-val (get-simplified x))))
    211 (defn get-simplified [ast]
     215;;        (prn (ctor-get-val (get-fact-simplified x))))
     216(defn get-fact-simplified [ast]
    212217  (get-fact MagnoliaFacts/Type_Simplified ast))
    213218
     
    225230;; E.g. (doseq [x (get-contents-seq "basic.Basic")] (prn x))
    226231(defn get-contents-seq [s] ;; string -> seq
    227   (iterator-seq (.iterator (ctor-get-val (get-contents s)))))
     232  (iterator-seq (.iterator (ctor-get-val (get-fact-contents s)))))
    228233
    229234;; E.g. (println (get-cxx-code "basic.Basic"))
     
    235240  (println (.getValue
    236241            (rcall "prettyMagnolia"
    237                    (ctor-get-val (get-type-checked s))))))
     242                   (ctor-get-val (get-fact-type-checked s))))))
    238243
    239244(defn run-pretty-magnolia [s rich?]
  • trunk/magnolia-eclipse/test/org/magnolialang/test/core.clj

    r824 r827  
    5555  (rimport "org::magnolialang::pgf::tests::TestToken")
    5656  (reval-str "runTestToken()"))
     57
     58(deftest test-rascal-pp
     59  (rimport "org::magnolialang::testutil::RascalPp")
     60  (rcall "runTestRascalPp")
     61  (rprint (get-fact-imploded-tree "basic.Basic") false)
     62  (rprint (get-fact-imploded-tree "basic.Basic") true))
     63
Note: See TracChangeset for help on using the changeset viewer.