(Object reader, Object caret, Object opts, Object pendingForms)
| 943 | |
| 944 | public 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 |
nothing calls this directly
no test coverage detected