247 */ |
247 */ |
248 JCTree attribSpeculative(JCTree tree, Env<AttrContext> env, ResultInfo resultInfo) { |
248 JCTree attribSpeculative(JCTree tree, Env<AttrContext> env, ResultInfo resultInfo) { |
249 JCTree newTree = new TreeCopier<Object>(make).copy(tree); |
249 JCTree newTree = new TreeCopier<Object>(make).copy(tree); |
250 Env<AttrContext> speculativeEnv = env.dup(newTree, env.info.dup(env.info.scope.dupUnshared())); |
250 Env<AttrContext> speculativeEnv = env.dup(newTree, env.info.dup(env.info.scope.dupUnshared())); |
251 speculativeEnv.info.scope.owner = env.info.scope.owner; |
251 speculativeEnv.info.scope.owner = env.info.scope.owner; |
252 Filter<JCDiagnostic> prevDeferDiagsFilter = log.deferredDiagFilter; |
|
253 Queue<JCDiagnostic> prevDeferredDiags = log.deferredDiagnostics; |
|
254 final JavaFileObject currentSource = log.currentSourceFile(); |
252 final JavaFileObject currentSource = log.currentSourceFile(); |
|
253 Log.DeferredDiagnosticHandler deferredDiagnosticHandler = |
|
254 new Log.DeferredDiagnosticHandler(log, new Filter<JCDiagnostic>() { |
|
255 public boolean accepts(JCDiagnostic t) { |
|
256 return t.getDiagnosticSource().getFile().equals(currentSource); |
|
257 } |
|
258 }); |
255 try { |
259 try { |
256 log.deferredDiagnostics = new ListBuffer<JCDiagnostic>(); |
|
257 log.deferredDiagFilter = new Filter<JCDiagnostic>() { |
|
258 public boolean accepts(JCDiagnostic t) { |
|
259 return t.getDiagnosticSource().getFile().equals(currentSource); |
|
260 } |
|
261 }; |
|
262 attr.attribTree(newTree, speculativeEnv, resultInfo); |
260 attr.attribTree(newTree, speculativeEnv, resultInfo); |
263 unenterScanner.scan(newTree); |
261 unenterScanner.scan(newTree); |
264 return newTree; |
262 return newTree; |
265 } catch (Abort ex) { |
263 } catch (Abort ex) { |
266 //if some very bad condition occurred during deferred attribution |
264 //if some very bad condition occurred during deferred attribution |
267 //we should dump all errors before killing javac |
265 //we should dump all errors before killing javac |
268 log.reportDeferredDiagnostics(); |
266 deferredDiagnosticHandler.reportDeferredDiagnostics(); |
269 throw ex; |
267 throw ex; |
270 } finally { |
268 } finally { |
271 unenterScanner.scan(newTree); |
269 unenterScanner.scan(newTree); |
272 log.deferredDiagFilter = prevDeferDiagsFilter; |
270 log.popDiagnosticHandler(deferredDiagnosticHandler); |
273 log.deferredDiagnostics = prevDeferredDiags; |
|
274 } |
271 } |
275 } |
272 } |
276 //where |
273 //where |
277 protected TreeScanner unenterScanner = new TreeScanner() { |
274 protected TreeScanner unenterScanner = new TreeScanner() { |
278 @Override |
275 @Override |