169 endPosTable = newEndPosTable(keepEndPositions); |
169 endPosTable = newEndPosTable(keepEndPositions); |
170 } |
170 } |
171 |
171 |
172 protected AbstractEndPosTable newEndPosTable(boolean keepEndPositions) { |
172 protected AbstractEndPosTable newEndPosTable(boolean keepEndPositions) { |
173 return keepEndPositions |
173 return keepEndPositions |
174 ? new SimpleEndPosTable() |
174 ? new SimpleEndPosTable(this) |
175 : new EmptyEndPosTable(); |
175 : new EmptyEndPosTable(this); |
176 } |
176 } |
177 |
177 |
178 protected DocCommentTable newDocCommentTable(boolean keepDocComments, ParserFactory fac) { |
178 protected DocCommentTable newDocCommentTable(boolean keepDocComments, ParserFactory fac) { |
179 return keepDocComments ? new LazyDocCommentTable(fac) : null; |
179 return keepDocComments ? new LazyDocCommentTable(fac) : null; |
180 } |
180 } |
3086 storeEnd(toplevel, S.prevToken().endPos); |
3086 storeEnd(toplevel, S.prevToken().endPos); |
3087 if (keepDocComments) |
3087 if (keepDocComments) |
3088 toplevel.docComments = docComments; |
3088 toplevel.docComments = docComments; |
3089 if (keepLineMap) |
3089 if (keepLineMap) |
3090 toplevel.lineMap = S.getLineMap(); |
3090 toplevel.lineMap = S.getLineMap(); |
|
3091 this.endPosTable.setParser(null); // remove reference to parser |
3091 toplevel.endPositions = this.endPosTable; |
3092 toplevel.endPositions = this.endPosTable; |
3092 return toplevel; |
3093 return toplevel; |
3093 } |
3094 } |
3094 |
3095 |
3095 /** ImportDeclaration = IMPORT [ STATIC ] Ident { "." Ident } [ "." "*" ] ";" |
3096 /** ImportDeclaration = IMPORT [ STATIC ] Ident { "." Ident } [ "." "*" ] ";" |
4001 } |
4002 } |
4002 |
4003 |
4003 /* |
4004 /* |
4004 * a functional source tree and end position mappings |
4005 * a functional source tree and end position mappings |
4005 */ |
4006 */ |
4006 protected class SimpleEndPosTable extends AbstractEndPosTable { |
4007 protected static class SimpleEndPosTable extends AbstractEndPosTable { |
4007 |
4008 |
4008 private final Map<JCTree, Integer> endPosMap; |
4009 private final Map<JCTree, Integer> endPosMap; |
4009 |
4010 |
4010 SimpleEndPosTable() { |
4011 SimpleEndPosTable(JavacParser parser) { |
|
4012 super(parser); |
4011 endPosMap = new HashMap<JCTree, Integer>(); |
4013 endPosMap = new HashMap<JCTree, Integer>(); |
4012 } |
4014 } |
4013 |
4015 |
4014 protected void storeEnd(JCTree tree, int endpos) { |
4016 protected void storeEnd(JCTree tree, int endpos) { |
4015 endPosMap.put(tree, errorEndPos > endpos ? errorEndPos : endpos); |
4017 endPosMap.put(tree, errorEndPos > endpos ? errorEndPos : endpos); |
4016 } |
4018 } |
4017 |
4019 |
4018 protected <T extends JCTree> T to(T t) { |
4020 protected <T extends JCTree> T to(T t) { |
4019 storeEnd(t, token.endPos); |
4021 storeEnd(t, parser.token.endPos); |
4020 return t; |
4022 return t; |
4021 } |
4023 } |
4022 |
4024 |
4023 protected <T extends JCTree> T toP(T t) { |
4025 protected <T extends JCTree> T toP(T t) { |
4024 storeEnd(t, S.prevToken().endPos); |
4026 storeEnd(t, parser.S.prevToken().endPos); |
4025 return t; |
4027 return t; |
4026 } |
4028 } |
4027 |
4029 |
4028 public int getEndPos(JCTree tree) { |
4030 public int getEndPos(JCTree tree) { |
4029 Integer value = endPosMap.get(tree); |
4031 Integer value = endPosMap.get(tree); |
4041 } |
4043 } |
4042 |
4044 |
4043 /* |
4045 /* |
4044 * a default skeletal implementation without any mapping overhead. |
4046 * a default skeletal implementation without any mapping overhead. |
4045 */ |
4047 */ |
4046 protected class EmptyEndPosTable extends AbstractEndPosTable { |
4048 protected static class EmptyEndPosTable extends AbstractEndPosTable { |
|
4049 |
|
4050 EmptyEndPosTable(JavacParser parser) { |
|
4051 super(parser); |
|
4052 } |
4047 |
4053 |
4048 protected void storeEnd(JCTree tree, int endpos) { /* empty */ } |
4054 protected void storeEnd(JCTree tree, int endpos) { /* empty */ } |
4049 |
4055 |
4050 protected <T extends JCTree> T to(T t) { |
4056 protected <T extends JCTree> T to(T t) { |
4051 return t; |
4057 return t; |
4063 return Position.NOPOS; |
4069 return Position.NOPOS; |
4064 } |
4070 } |
4065 |
4071 |
4066 } |
4072 } |
4067 |
4073 |
4068 protected abstract class AbstractEndPosTable implements EndPosTable { |
4074 protected static abstract class AbstractEndPosTable implements EndPosTable { |
|
4075 /** |
|
4076 * The current parser. |
|
4077 */ |
|
4078 protected JavacParser parser; |
4069 |
4079 |
4070 /** |
4080 /** |
4071 * Store the last error position. |
4081 * Store the last error position. |
4072 */ |
4082 */ |
4073 protected int errorEndPos; |
4083 protected int errorEndPos; |
|
4084 |
|
4085 public AbstractEndPosTable(JavacParser parser) { |
|
4086 this.parser = parser; |
|
4087 } |
4074 |
4088 |
4075 /** |
4089 /** |
4076 * Store ending position for a tree, the value of which is the greater |
4090 * Store ending position for a tree, the value of which is the greater |
4077 * of last error position and the given ending position. |
4091 * of last error position and the given ending position. |
4078 * @param tree The tree. |
4092 * @param tree The tree. |