MCPcopy Index your code
hub / github.com/clojure/clojure / invoke

Method invoke

src/jvm/clojure/lang/LispReader.java:945–987  ·  view source on GitHub ↗
(Object reader, Object caret, Object opts, Object pendingForms)

Source from the content-addressed store, hash-verified

943
944public static class MetaReader extends AFn{
945 public Object invoke(Object reader, Object caret, Object opts, Object pendingForms) {
946 PushbackReader r = (PushbackReader) reader;
947 int line = -1;
948 int column = -1;
949 if(r instanceof LineNumberingPushbackReader)
950 {
951 line = ((LineNumberingPushbackReader) r).getLineNumber();
952 column = ((LineNumberingPushbackReader) r).getColumnNumber()-1;
953 }
954 pendingForms = ensurePending(pendingForms);
955 Object meta = read(r, true, null, true, opts, pendingForms);
956 if(meta instanceof Symbol || meta instanceof String)
957 meta = RT.map(RT.TAG_KEY, meta);
958 else if (meta instanceof Keyword)
959 meta = RT.map(meta, RT.T);
960 else if (meta instanceof IPersistentVector)
961 meta = RT.map(RT.PARAM_TAGS_KEY, meta);
962 else if(!(meta instanceof IPersistentMap))
963 throw new IllegalArgumentException("Metadata must be Symbol,Keyword,String,Vector or Map");
964
965 Object o = read(r, true, null, true, opts, pendingForms);
966 if(o instanceof IMeta)
967 {
968 if(line != -1 && o instanceof ISeq)
969 {
970 meta = RT.assoc(meta, RT.LINE_KEY, RT.get(meta, RT.LINE_KEY, line));
971 meta = RT.assoc(meta, RT.COLUMN_KEY, RT.get(meta,RT.COLUMN_KEY, column));
972 }
973 if(o instanceof IReference)
974 {
975 ((IReference)o).resetMeta((IPersistentMap) meta);
976 return o;
977 }
978 Object ometa = RT.meta(o);
979 for(ISeq s = RT.seq(meta); s != null; s = s.next()) {
980 IMapEntry kv = (IMapEntry) s.first();
981 ometa = RT.assoc(ometa, kv.getKey(), kv.getValue());
982 }
983 return ((IObj) o).withMeta((IPersistentMap) ometa);
984 }
985 else
986 throw new IllegalArgumentException("Metadata can only be applied to IMetas");
987 }
988
989}
990

Callers

nothing calls this directly

Calls 15

mapMethod · 0.95
assocMethod · 0.95
getMethod · 0.95
metaMethod · 0.95
seqMethod · 0.95
nextMethod · 0.95
firstMethod · 0.95
ensurePendingMethod · 0.80
resetMetaMethod · 0.65
withMetaMethod · 0.65
getLineNumberMethod · 0.45
getColumnNumberMethod · 0.45

Tested by

no test coverage detected