@@ -1665,7 +1665,8 @@ private void handleSwitch(JCTree switchTree,
1665
1665
} else {
1666
1666
patternSwitch = cases .stream ()
1667
1667
.flatMap (c -> c .labels .stream ())
1668
- .anyMatch (l -> l .hasTag (PATTERNCASELABEL ));
1668
+ .anyMatch (l -> l .hasTag (PATTERNCASELABEL ) ||
1669
+ TreeInfo .isNullCaseLabel (l ));
1669
1670
}
1670
1671
1671
1672
// Attribute all cases and
@@ -1677,7 +1678,6 @@ private void handleSwitch(JCTree switchTree,
1677
1678
boolean hasNullPattern = false ; // Is there a null pattern?
1678
1679
CaseTree .CaseKind caseKind = null ;
1679
1680
boolean wasError = false ;
1680
- MatchBindings prevBindings = null ;
1681
1681
for (List <JCCase > l = cases ; l .nonEmpty (); l = l .tail ) {
1682
1682
JCCase c = l .head ;
1683
1683
if (caseKind == null ) {
@@ -1687,7 +1687,7 @@ private void handleSwitch(JCTree switchTree,
1687
1687
Errors .SwitchMixingCaseTypes );
1688
1688
wasError = true ;
1689
1689
}
1690
- MatchBindings currentBindings = prevBindings ;
1690
+ MatchBindings currentBindings = null ;
1691
1691
boolean wasUnconditionalPattern = hasUnconditionalPattern ;
1692
1692
for (JCCaseLabel label : c .labels ) {
1693
1693
if (label instanceof JCConstantCaseLabel constLabel ) {
@@ -1751,7 +1751,7 @@ private void handleSwitch(JCTree switchTree,
1751
1751
} else if (label instanceof JCPatternCaseLabel patternlabel ) {
1752
1752
//pattern
1753
1753
JCPattern pat = patternlabel .pat ;
1754
- attribExpr (pat , switchEnv );
1754
+ attribExpr (pat , switchEnv , seltype );
1755
1755
Type primaryType = TreeInfo .primaryPatternType (pat );
1756
1756
if (!primaryType .hasTag (TYPEVAR )) {
1757
1757
primaryType = chk .checkClassOrArrayType (pat .pos (), primaryType );
@@ -1805,9 +1805,6 @@ private void handleSwitch(JCTree switchTree,
1805
1805
1806
1806
preFlow (c );
1807
1807
c .completesNormally = flow .aliveAfter (caseEnv , c , make );
1808
-
1809
- prevBindings = c .caseKind == CaseTree .CaseKind .STATEMENT && c .completesNormally ? currentBindings
1810
- : null ;
1811
1808
}
1812
1809
if (patternSwitch ) {
1813
1810
chk .checkSwitchCaseStructure (cases );
@@ -4078,7 +4075,7 @@ public void visitTypeTest(JCInstanceOf tree) {
4078
4075
if (tree .pattern .getTag () == BINDINGPATTERN ||
4079
4076
tree .pattern .getTag () == PARENTHESIZEDPATTERN ||
4080
4077
tree .pattern .getTag () == RECORDPATTERN ) {
4081
- attribTree (tree .pattern , env , unknownExprInfo );
4078
+ attribExpr (tree .pattern , env , exprtype );
4082
4079
clazztype = tree .pattern .type ;
4083
4080
if (types .isSubtype (exprtype , clazztype ) &&
4084
4081
!exprtype .isErroneous () && !clazztype .isErroneous () &&
@@ -4146,8 +4143,7 @@ private boolean checkCastablePattern(DiagnosticPosition pos,
4146
4143
public void visitBindingPattern (JCBindingPattern tree ) {
4147
4144
Type type ;
4148
4145
if (tree .var .vartype != null ) {
4149
- ResultInfo varInfo = new ResultInfo (KindSelector .TYP , resultInfo .pt , resultInfo .checkContext );
4150
- type = attribTree (tree .var .vartype , env , varInfo );
4146
+ type = attribType (tree .var .vartype , env );
4151
4147
} else {
4152
4148
type = resultInfo .pt ;
4153
4149
}
@@ -4170,14 +4166,20 @@ public void visitBindingPattern(JCBindingPattern tree) {
4170
4166
4171
4167
@ Override
4172
4168
public void visitRecordPattern (JCRecordPattern tree ) {
4173
- tree .type = attribType (tree .deconstructor , env );
4169
+ Type type = attribType (tree .deconstructor , env );
4170
+ if (type .isRaw () && type .tsym .getTypeParameters ().nonEmpty ()) {
4171
+ Type inferred = infer .instantiatePatternType (resultInfo .pt , type .tsym );
4172
+ if (inferred == null ) {
4173
+ log .error (tree .pos (), Errors .PatternTypeCannotInfer );
4174
+ } else {
4175
+ type = inferred ;
4176
+ }
4177
+ }
4178
+ tree .type = tree .deconstructor .type = type ;
4174
4179
Type site = types .removeWildcards (tree .type );
4175
4180
List <Type > expectedRecordTypes ;
4176
4181
if (site .tsym .kind == Kind .TYP && ((ClassSymbol ) site .tsym ).isRecord ()) {
4177
4182
ClassSymbol record = (ClassSymbol ) site .tsym ;
4178
- if (record .type .getTypeArguments ().nonEmpty () && tree .type .isRaw ()) {
4179
- log .error (tree .pos (),Errors .RawDeconstructionPattern );
4180
- }
4181
4183
expectedRecordTypes = record .getRecordComponents ()
4182
4184
.stream ()
4183
4185
.map (rc -> types .memberType (site , rc )).collect (List .collector ());
@@ -4195,10 +4197,7 @@ public void visitRecordPattern(JCRecordPattern tree) {
4195
4197
Env <AttrContext > localEnv = env .dup (tree , env .info .dup (env .info .scope .dup ()));
4196
4198
try {
4197
4199
while (recordTypes .nonEmpty () && nestedPatterns .nonEmpty ()) {
4198
- boolean nestedIsVarPattern = false ;
4199
- nestedIsVarPattern |= nestedPatterns .head .hasTag (BINDINGPATTERN ) &&
4200
- ((JCBindingPattern ) nestedPatterns .head ).var .vartype == null ;
4201
- attribExpr (nestedPatterns .head , localEnv , nestedIsVarPattern ? recordTypes .head : Type .noType );
4200
+ attribExpr (nestedPatterns .head , localEnv , recordTypes .head );
4202
4201
checkCastablePattern (nestedPatterns .head .pos (), recordTypes .head , nestedPatterns .head .type );
4203
4202
outBindings .addAll (matchBindings .bindingsWhenTrue );
4204
4203
matchBindings .bindingsWhenTrue .forEach (localEnv .info .scope ::enter );
@@ -4216,21 +4215,6 @@ public void visitRecordPattern(JCRecordPattern tree) {
4216
4215
Errors .IncorrectNumberOfNestedPatterns (expectedRecordTypes ,
4217
4216
nestedTypes ));
4218
4217
}
4219
- if (tree .var != null ) {
4220
- BindingSymbol v = new BindingSymbol (tree .var .mods .flags , tree .var .name , tree .type ,
4221
- localEnv .info .scope .owner );
4222
- v .pos = tree .pos ;
4223
- tree .var .sym = v ;
4224
- if (chk .checkUnique (tree .var .pos (), v , localEnv .info .scope )) {
4225
- chk .checkTransparentVar (tree .var .pos (), v , localEnv .info .scope );
4226
- }
4227
- if (tree .var .vartype != null ) {
4228
- annotate .annotateLater (tree .var .mods .annotations , localEnv , v , tree .pos ());
4229
- annotate .queueScanTreeAndTypeAnnotate (tree .var .vartype , localEnv , v , tree .var .pos ());
4230
- annotate .flush ();
4231
- }
4232
- outBindings .add (v );
4233
- }
4234
4218
} finally {
4235
4219
localEnv .info .scope .leave ();
4236
4220
}
0 commit comments