@@ -237,32 +237,6 @@ trait Infer extends Checkable {
237
237
withDisambiguation(List (), tp1, tp2)(global.explainTypes(tp1, tp2))
238
238
}
239
239
240
- // When filtering sym down to the accessible alternatives leaves us empty handed.
241
- private def checkAccessibleError (tree : Tree , sym : Symbol , pre : Type , site : Tree ): Tree = {
242
- if (settings.isDebug) {
243
- Console .println(context)
244
- Console .println(tree)
245
- Console .println(" " + pre + " " + sym.owner + " " + context.owner + " " + context.outer.enclClass.owner + " " + sym.owner.thisType + (pre =:= sym.owner.thisType))
246
- }
247
- ErrorUtils .issueTypeError(AccessError (tree, sym, pre, context.enclClass.owner,
248
- if (settings.check.isDefault)
249
- analyzer.lastAccessCheckDetails
250
- else
251
- ptBlock(" because of an internal error (no accessible symbol)" ,
252
- " sym.ownerChain" -> sym.ownerChain,
253
- " underlyingSymbol(sym)" -> underlyingSymbol(sym),
254
- " pre" -> pre,
255
- " site" -> site,
256
- " tree" -> tree,
257
- " sym.accessBoundary(sym.owner)" -> sym.accessBoundary(sym.owner),
258
- " context.owner" -> context.owner,
259
- " context.outer.enclClass.owner" -> context.outer.enclClass.owner
260
- )
261
- ))(context)
262
-
263
- setError(tree)
264
- }
265
-
266
240
/* -- Tests & Checks---------------------------------------------------- */
267
241
268
242
/** Check that `sym` is defined and accessible as a member of
@@ -279,41 +253,71 @@ trait Infer extends Checkable {
279
253
* since pre may not occur in its type (callers should wrap the result in a TypeTreeWithDeferredRefCheck)
280
254
*/
281
255
def checkAccessible (tree : Tree , sym : Symbol , pre : Type , site : Tree , isJava : Boolean ): Tree = {
256
+ // When filtering sym down to the accessible alternatives leaves us empty handed.
257
+ def checkAccessibleError (tree : Tree , sym : Symbol , pre : Type , site : Tree ): Tree = {
258
+ if (settings.isDebug) {
259
+ Console .println(context)
260
+ Console .println(tree)
261
+ Console .println(s " $pre ${sym.owner} ${context.owner} ${context.outer.enclClass.owner} ${sym.owner.thisType
262
+ } ${pre =:= sym.owner.thisType}" )
263
+ }
264
+ ErrorUtils .issueTypeError(AccessError (tree, sym, pre, context.enclClass.owner,
265
+ if (settings.check.isDefault)
266
+ analyzer.lastAccessCheckDetails
267
+ else
268
+ ptBlock(" because of an internal error (no accessible symbol)" ,
269
+ " sym.ownerChain" -> sym.ownerChain,
270
+ " underlyingSymbol(sym)" -> underlyingSymbol(sym),
271
+ " pre" -> pre,
272
+ " site" -> site,
273
+ " tree" -> tree,
274
+ " sym.accessBoundary(sym.owner)" -> sym.accessBoundary(sym.owner),
275
+ " context.owner" -> context.owner,
276
+ " context.outer.enclClass.owner" -> context.outer.enclClass.owner
277
+ )
278
+ ))(context)
279
+
280
+ setError(tree)
281
+ }
282
282
def malformed (ex : MalformedType , instance : Type ): Type = {
283
283
val what = if (ex.msg contains " malformed type" ) " is malformed" else s " contains a ${ex.msg}"
284
284
val message = s " \n because its instance type $instance $what"
285
285
val error = AccessError (tree, sym, pre, context.enclClass.owner, message)
286
286
ErrorUtils .issueTypeError(error)(context)
287
287
ErrorType
288
288
}
289
- def accessible = sym.filter(context.isAccessible(_, pre, site.isInstanceOf [Super ])) match {
290
- case NoSymbol if sym.isJavaDefined && context.unit.isJava => sym // don't try to second guess Java; see #4402
291
- case sym1 => sym1
292
- }
293
289
if (context.unit.exists && settings.YtrackDependencies .value)
294
290
context.unit.registerDependency(sym.enclosingTopLevelClass)
295
291
296
292
if (sym.isError)
297
- tree setSymbol sym setType ErrorType
298
- else accessible match {
299
- case NoSymbol => checkAccessibleError(tree, sym, pre, site)
300
- case acc if context.owner.isTermMacro && (acc hasFlag LOCKED ) => throw CyclicReference (acc, CheckAccessibleMacroCycle )
301
- case acc =>
302
- val sym1 = if (acc.isTerm) acc.cookJavaRawInfo() else acc // xform java rawtypes into existentials
303
- val owntype = (
304
- try pre memberType sym1
305
- catch { case ex : MalformedType => malformed(ex, pre memberType underlyingSymbol(sym)) }
306
- )
307
- tree setSymbol sym1 setType (
293
+ tree.setSymbol(sym).setType(ErrorType )
294
+ else {
295
+ val accessible = sym.filter(context.isAccessible(_, pre, site.isInstanceOf [Super ])) match {
296
+ case NoSymbol if sym.isJavaDefined && context.unit.isJava => sym // don't try to second guess Java; see #4402
297
+ case sym1 => sym1
298
+ }
299
+ if (accessible eq NoSymbol )
300
+ checkAccessibleError(tree, sym, pre, site)
301
+ else if (context.owner.isTermMacro && accessible.hasFlag(LOCKED ))
302
+ throw CyclicReference (accessible, CheckAccessibleMacroCycle )
303
+ else {
304
+ val sym1 =
305
+ if (accessible.isTerm) accessible.cookJavaRawInfo() // xform java rawtypes into existentials
306
+ else accessible
307
+ val owntype =
308
+ try pre.memberType(sym1)
309
+ catch { case ex : MalformedType => malformed(ex, pre.memberType(underlyingSymbol(sym))) }
310
+ val owntype1 =
308
311
pre match {
309
312
// OPT: avoid lambda allocation and Type.map for super constructor calls
310
313
case _ : SuperType if ! sym.isConstructor && ! owntype.isInstanceOf [OverloadedType ] =>
311
- owntype map ((tp : Type ) => if (tp eq pre) site.symbol.thisType else tp)
314
+ owntype. map((tp : Type ) => if (tp eq pre) site.symbol.thisType else tp)
312
315
case _ =>
313
316
if ((owntype eq ObjectTpe ) && isJava) ObjectTpeJava
314
317
else owntype
315
318
}
316
- )
319
+ tree.setSymbol(sym1).setType(owntype1)
320
+ }
317
321
}
318
322
}
319
323
0 commit comments