001package gudusoft.gsqlparser.ir.semantic;
002
003/**
004 * The single descriptor catalog for stable diagnostic metadata.
005 *
006 * <p>Every {@link DiagnosticCode} is deliberately named in the switch below.
007 * The {@code default} is not a fallback classification: it rejects newly
008 * added codes until their ownership category has been reviewed. The
009 * catalog's exhaustiveness test calls this method for every enum value.
010 */
011public final class DiagnosticDescriptorCatalog {
012
013    private DiagnosticDescriptorCatalog() {}
014
015    /**
016     * Return the compiler-layer ownership category for {@code code}.
017     *
018     * @throws NullPointerException if {@code code} is null
019     * @throws IllegalArgumentException if a newly added code has not yet been
020     *         classified
021     */
022    public static DiagnosticCategory categoryOf(DiagnosticCode code) {
023        if (code == null) {
024            throw new NullPointerException("code");
025        }
026        switch (code) {
027            case PARSE_FAILED:
028                return DiagnosticCategory.SYNTAX_ERROR;
029
030            case BRANCH_COLUMN_REF_UNKNOWN_RELATION:
031            case CREATE_AS_COLUMN_COUNT_MISMATCH:
032            case CROSS_WITH_ON:
033            case CROSS_WITH_USING:
034            case CTE_BODY_MISSING:
035            case CTE_EXPLICIT_COLUMN_LIST_ARITY_MISMATCH:
036            case CTE_FORWARD_REFERENCE:
037            case DELETE_TARGET_MISSING:
038            case DISTINCT_ON_EMPTY_COLUMN_LIST:
039            case DUPLICATE_CTE_NAME:
040            case DUPLICATE_FROM_SUBQUERY_ALIAS:
041            case DUPLICATE_RELATION_ALIAS:
042            case FROM_SOURCE_NO_TABLE:
043            case INSERT_COLUMN_COUNT_MISMATCH:
044            case INSERT_TARGET_MISSING:
045            case JOIN_ITEM_NO_TABLE:
046            case JOIN_MISSING_ON_OR_USING:
047            case JOIN_WITH_BOTH_ON_AND_USING:
048            case LEGACY_OUTER_JOIN_BOOLEAN_CONTEXT_NOT_ALLOWED:
049            case LEGACY_OUTER_JOIN_MULTIPLE_NULL_GENERATED_RELATIONS:
050            case LEGACY_OUTER_JOIN_RECIPROCAL_NULL_GENERATION:
051            case MERGE_CTE_EXPLICIT_COLUMN_LIST_ARITY_MISMATCH:
052            case MERGE_NOT_MATCHED_BY_SOURCE_INSERT_NOT_VALID:
053            case MERGE_NOT_MATCHED_BY_SOURCE_REFERENCES_SOURCE:
054            case MERGE_ON_CONDITION_MISSING:
055            case MERGE_TARGET_MISSING:
056            case MERGE_USING_SOURCE_MISSING:
057            case MERGE_WHEN_NO_ACTION:
058            case NATURAL_WITH_ON:
059            case NATURAL_WITH_USING:
060            case ORDER_BY_ORDINAL_OUT_OF_RANGE:
061            case OUTPUT_DELETED_ON_INSERT_NOT_SUPPORTED:
062            case OUTPUT_INSERTED_ON_DELETE_NOT_SUPPORTED:
063            case OUTPUT_REFERENCES_UNKNOWN_RELATION:
064            case RETURNING_EMPTY_PROJECTION:
065            case RETURNING_STAR_QUALIFIER_UNKNOWN:
066            case SCALAR_SUBQUERY_COLUMN_COUNT:
067            case SCALAR_SUBQUERY_UNKNOWN_RELATION_ALIAS:
068            case SELECT_NO_PROJECTED_COLUMNS:
069            case SET_OP_BRANCH_COLUMN_COUNT_MISMATCH:
070            case SET_OP_BRANCH_COUNT_TOO_FEW:
071            case STAR_EXPANSION_QUALIFIER_AMBIGUOUS:
072            case STAR_EXPANSION_QUALIFIER_NOT_FOUND:
073            case UNQUALIFIED_COLUMN_AMBIGUOUS:
074            case UNQUALIFIED_MERGED_KEY_IN_JOIN_ON:
075            case UPDATE_NO_SET_CLAUSE:
076            case UPDATE_TARGET_MISSING:
077            case USING_KEY_NOT_DECLARED:
078                return DiagnosticCategory.DIALECT_SEMANTIC_ERROR;
079
080            case NATURAL_CATALOG_REQUIRED:
081            case NESTED_BLOCK_UNANALYZED:
082            case STAR_EXPANSION_MULTI_RELATION_FROM:
083            case STAR_EXPANSION_NO_CATALOG:
084                return DiagnosticCategory.ANALYSIS_DEGRADED;
085
086            case RELATION_NOT_FOUND_IN_CATALOG:
087                return DiagnosticCategory.ADVISORY;
088
089            case CLAUSE_WINDOW_FUNCTION_LEAK:
090            case COLUMN_BINDING_NON_EXACT:
091            case COMMA_FROM_IN_BODY_NOT_SUPPORTED:
092            case CORRELATED_SCALAR_SUBQUERY_UNKNOWN_OUTER_BINDING:
093            case CREATE_AS_NO_SOURCE_SELECT:
094            case CREATE_AS_TARGET_MISSING:
095            case CROSS_JOIN_IN_BODY_NOT_SUPPORTED:
096            case CTE_WITH_RECURSIVE_NOT_SUPPORTED:
097            case DELETE_CTE_NOT_SUPPORTED:
098            case DELETE_FROM_JOIN_NATURAL_NOT_SUPPORTED:
099            case DELETE_FROM_JOIN_USING_NOT_SUPPORTED:
100            case DELETE_FROM_NESTED_JOIN_NOT_SUPPORTED:
101            case DELETE_JOINED_NOT_SUPPORTED:
102            case DELETE_JOIN_ON_HAS_SUBQUERY_NOT_SUPPORTED:
103            case DELETE_ORDER_BY_OR_LIMIT_NOT_SUPPORTED:
104            case DELETE_OUTPUT_CLAUSE_NOT_SUPPORTED:
105            case DELETE_RETURNING_CLAUSE_NOT_SUPPORTED:
106            case DELETE_WHERE_EXISTS_BODY_MISSING:
107            case DELETE_WHERE_EXISTS_CORRELATED_UNKNOWN_OUTER_ALIAS:
108            case DELETE_WHERE_EXISTS_INNER_RELATION_UNKNOWN:
109            case DELETE_WHERE_OUTER_SHAPE_REJECTED:
110            case DELETE_WHERE_PREDICATE_GENERIC_NOT_SUPPORTED:
111            case DELETE_WHERE_PREDICATE_NOT_LIFTABLE:
112            case DELETE_WHERE_PREDICATE_NOT_NOT_SUPPORTED:
113            case DELETE_WHERE_PREDICATE_SCALAR_COMPARISON_NOT_LIFTABLE:
114            case DISTINCT_ON_HAS_SUBQUERY_NOT_SUPPORTED:
115            case DISTINCT_ON_NOT_SUPPORTED:
116            case DUPLICATE_OUTPUT_NAME:
117            case FROM_SUBQUERY_ALIAS_REQUIRED:
118            case FROM_SUBQUERY_BINDING_UNRESOLVED:
119            case FROM_SUBQUERY_INNER_SUBQUERY_IN_GROUP_BY:
120            case FROM_SUBQUERY_INNER_SUBQUERY_IN_JOIN_ON:
121            case FROM_SUBQUERY_INNER_SUBQUERY_IN_WHERE:
122            case FROM_SUBQUERY_IN_BODY_CONTEXT_NOT_SUPPORTED:
123            case FROM_SUBQUERY_IN_SET_OP_BRANCH_FROM:
124            case FROM_SUBQUERY_NO_INNER_SELECT:
125            case FROM_SUBQUERY_ON_JOIN_SIDE_IN_SET_OP_BRANCH:
126            case GROUP_BY_HAS_SUBQUERY_NOT_SUPPORTED:
127            case HAVING_HAS_SUBQUERY_NOT_SUPPORTED:
128            case HAVING_SUBQUERY_NOT_SUPPORTED:
129            case HAVING_WINDOW_FUNCTION_NOT_SUPPORTED:
130            case INSERT_MIXED_OUTER_AND_INNER_WITH_NOT_SUPPORTED:
131            case INSERT_MULTI_TABLE_NOT_SUPPORTED:
132            case INSERT_OUTER_WITH_ON_HIVE_MULTI_INSERT_NOT_SUPPORTED:
133            case INSERT_SOURCE_NOT_SUPPORTED:
134            case JOIN_ON_EXISTS_BODY_MISSING:
135            case JOIN_ON_EXISTS_CORRELATED_UNKNOWN_OUTER_ALIAS:
136            case JOIN_ON_EXISTS_INNER_COLUMN_COUNT:
137            case JOIN_ON_EXISTS_INNER_COMMA_FROM:
138            case JOIN_ON_EXISTS_INNER_CROSS_JOIN:
139            case JOIN_ON_EXISTS_INNER_FROM_SUBQUERY:
140            case JOIN_ON_EXISTS_INNER_FROM_SUBQUERY_ON_JOIN:
141            case JOIN_ON_EXISTS_INNER_IS_SET_OP:
142            case JOIN_ON_EXISTS_INNER_MISSING_FROM:
143            case JOIN_ON_EXISTS_INNER_NATURAL:
144            case JOIN_ON_EXISTS_INNER_NON_CONSTANT_PROJECTION:
145            case JOIN_ON_EXISTS_INNER_RELATION_UNKNOWN:
146            case JOIN_ON_EXISTS_INNER_ROW_LIMIT:
147            case JOIN_ON_EXISTS_INNER_SUBQUERY_IN_GROUP_BY:
148            case JOIN_ON_EXISTS_INNER_SUBQUERY_IN_JOIN_ON:
149            case JOIN_ON_EXISTS_INNER_SUBQUERY_IN_WHERE:
150            case JOIN_ON_EXISTS_INNER_USING:
151            case JOIN_ON_EXISTS_INNER_WITH:
152            case JOIN_ON_EXISTS_WITHIN_GROUP_AGGREGATE:
153            case JOIN_ON_EXISTS_WITHIN_GROUP_NON_WHITELISTED:
154            case JOIN_ON_OUTER_SHAPE_REJECTED:
155            case JOIN_ON_PREDICATE_GENERIC_NOT_SUPPORTED:
156            case JOIN_ON_PREDICATE_NOT_LIFTABLE:
157            case JOIN_ON_PREDICATE_NOT_NOT_SUPPORTED:
158            case JOIN_ON_PREDICATE_SCALAR_COMPARISON_NOT_LIFTABLE:
159            case JOIN_ON_TOP_LEVEL_SUBQUERY_NOT_SUPPORTED:
160            case LEGACY_OUTER_JOIN_INTENT_NOT_LOWERABLE:
161            case MALFORMED_SET_OP_AST:
162            case MERGED_JOIN_AGAINST_CTE_WITH_EXPLICIT_COLUMN_LIST:
163            case MERGE_CTE_EXPLICIT_COLUMN_LIST_NOT_SUPPORTED:
164            case MERGE_CTE_NOT_SUPPORTED:
165            case MERGE_DO_NOTHING_NOT_SUPPORTED:
166            case MERGE_ERROR_LOGGING_NOT_SUPPORTED:
167            case MERGE_INSERT_DEFAULT_VALUES_NOT_SUPPORTED:
168            case MERGE_INSERT_VALUES_HAS_SUBQUERY_NOT_SUPPORTED:
169            case MERGE_LIMIT_NOT_SUPPORTED:
170            case MERGE_RETURNING_CLAUSE_NOT_SUPPORTED:
171            case MERGE_SOURCE_NOT_SUPPORTED:
172            case MERGE_UPDATE_DELETE_WHERE_NOT_SUPPORTED:
173            case MERGE_WHEN_CONDITION_HAS_SUBQUERY_NOT_SUPPORTED:
174            case MERGE_WHEN_NOT_MATCHED_BY_SOURCE_NOT_SUPPORTED:
175            case MIXED_SET_OPERATORS_NOT_SUPPORTED:
176            case MULTIPLE_STATEMENTS_NOT_SUPPORTED:
177            case NATURAL_IN_BODY_NOT_SUPPORTED:
178            case NESTED_JOIN_MERGED_KEY_NOT_SUPPORTED:
179            case NESTED_SCALAR_SUBQUERY_IN_PROJECTION:
180            case NESTED_WITH_NOT_SUPPORTED:
181            case ORDER_BY_CONSTANT_NOT_SUPPORTED:
182            case ORDER_BY_FETCH_FIRST_NOT_SUPPORTED:
183            case ORDER_BY_HAS_SUBQUERY_NOT_SUPPORTED:
184            case ORDER_BY_NAME_NOT_MATCHED_IN_SET_OP_OUTPUT:
185            case ORDER_BY_NO_PHYSICAL_COLUMN_REFS:
186            case ORDER_BY_OBJECT_REFERENCE_NO_USABLE_NAME:
187            case ORDER_BY_OBJECT_REFERENCE_UNSUPPORTED:
188            case ORDER_BY_OFFSET_NOT_SUPPORTED:
189            case ORDER_BY_ORDINAL_NOT_SUPPORTED:
190            case ORDER_BY_PROJECTION_ALIAS_NOT_SUPPORTED:
191            case ORDER_BY_QUALIFIED_REFERENCE_NOT_SUPPORTED:
192            case ORDER_BY_RESET_WHEN_NOT_SUPPORTED:
193            case ORDER_BY_SUBQUERY_NOT_SUPPORTED:
194            case ORDER_BY_UNSUPPORTED_SORT_KEY_SHAPE:
195            case ORDER_BY_WINDOW_FUNCTION_NOT_SUPPORTED:
196            case ORDER_SIBLINGS_BY_NOT_SUPPORTED:
197            case OUTPUT_INTO_NOT_SUPPORTED:
198            case OUTPUT_REFERENCES_UNSUPPORTED_BINDING_KIND:
199            case PIVOT_MULTIPLE_CLAUSES_NOT_SUPPORTED:
200            case PIVOT_STAR_CATALOG_REQUIRED:
201            case PIVOT_STAR_NOT_SUPPORTED:
202            case PIVOT_SUBQUERY_SOURCE_NOT_SUPPORTED:
203            case PIVOT_UNPIVOT_NOT_SUPPORTED:
204            case PIVOT_WITH_QUERY_CLAUSE_NOT_SUPPORTED:
205            case QUALIFY_NOT_SUPPORTED:
206            case RESULT_COLUMN_NO_COLUMN_REFS:
207            case RESULT_COLUMN_NO_NAME:
208            case RESULT_COLUMN_NULL_EXPRESSION:
209            case RESULT_COLUMN_SCALAR_SUBQUERY_EMBEDDED:
210            case RETURNING_HAS_AGGREGATE_NOT_SUPPORTED:
211            case RETURNING_HAS_SUBQUERY_NOT_SUPPORTED:
212            case RETURNING_INTO_NOT_SUPPORTED:
213            case RETURNING_STAR_CATALOG_REQUIRED:
214            case RETURNING_STAR_NOT_SUPPORTED:
215            case ROW_LIMIT_COUNT_UNRESOLVED:
216            case ROW_LIMIT_FETCH_FIRST_NOT_SUPPORTED:
217            case ROW_LIMIT_HIVE_LIMIT_GRAMMAR_QUIRK:
218            case ROW_LIMIT_LIMIT_NOT_SUPPORTED:
219            case ROW_LIMIT_OFFSET_NOT_SUPPORTED:
220            case ROW_LIMIT_TOP_NOT_SUPPORTED:
221            case ROW_LIMIT_TOP_PERCENT_NOT_SUPPORTED:
222            case ROW_LIMIT_TOP_WITH_TIES_NOT_SUPPORTED:
223            case SCALAR_SUBQUERY_ALIAS_REQUIRED:
224            case SCALAR_SUBQUERY_INNER_PROJECTION_UNNAMED:
225            case SCALAR_SUBQUERY_INNER_SUBQUERY_IN_GROUP_BY:
226            case SCALAR_SUBQUERY_INNER_SUBQUERY_IN_JOIN_ON:
227            case SCALAR_SUBQUERY_INNER_SUBQUERY_IN_WHERE:
228            case SCALAR_SUBQUERY_NO_INNER_SELECT:
229            case SELECT_NO_FROM_SOURCE:
230            case SELECT_ROW_FILTER_NOT_SUPPORTED:
231            case SELECT_ROW_FILTER_NULL:
232            case SELECT_ROW_FILTER_UNKNOWN:
233            case SELECT_WHERE_EXISTS_BODY_MISSING:
234            case SELECT_WHERE_EXISTS_CORRELATED_UNKNOWN_OUTER_ALIAS:
235            case SELECT_WHERE_EXISTS_INNER_RELATION_UNKNOWN:
236            case SELECT_WHERE_OUTER_SHAPE_REJECTED:
237            case SELECT_WHERE_PREDICATE_GENERIC_NOT_SUPPORTED:
238            case SELECT_WHERE_PREDICATE_NOT_LIFTABLE:
239            case SELECT_WHERE_PREDICATE_NOT_NOT_SUPPORTED:
240            case SELECT_WHERE_PREDICATE_SCALAR_COMPARISON_NOT_LIFTABLE:
241            case SET_OPERATION_NOT_SUPPORTED_IN_CONTEXT:
242            case SET_OP_BRANCH_DUPLICATE_OUTPUT_NAME:
243            case SET_OP_BRANCH_IS_SET_OP:
244            case SET_OP_BRANCH_OUTPUT_NAME_UNUSABLE:
245            case SET_OP_DUPLICATE_OUTER_OUTPUT_NAME:
246            case SET_OP_NON_ROOT_ORDER_BY_NOT_SUPPORTED:
247            case SET_OP_ORDER_BY_BRANCH_OUTPUT_NO_SOURCES:
248            case SET_OP_OUTER_ORDER_BY_NO_PHYSICAL_COLUMN_REFS:
249            case SET_OP_ROOT_TYPE_NONE:
250            case SET_OP_ROOT_TYPE_NULL:
251            case SET_OP_ROW_LIMIT_NOT_SUPPORTED:
252            case SET_OP_UNKNOWN_OPERATOR_TYPE:
253            case STAR_EXPANSION_EXPLICIT_CTE_COLUMN_LIST:
254            case STAR_EXPANSION_NON_BASE_TABLE:
255            case STAR_EXPANSION_NO_INSCOPE_RELATION_COLUMNS:
256            case STAR_EXPANSION_PREDICATE_BODY:
257            case STAR_EXPANSION_SYNTHETIC_BODY:
258            case STAR_EXPANSION_UNHANDLED_KIND:
259            case STATEMENT_KIND_NOT_SUPPORTED:
260            case TABLE_BINDING_UNRESOLVED:
261            case UNSUPPORTED_JOIN_TYPE:
262            case UPDATE_CTE_NOT_SUPPORTED:
263            case UPDATE_FROM_JOIN_NATURAL_NOT_SUPPORTED:
264            case UPDATE_FROM_JOIN_USING_NOT_SUPPORTED:
265            case UPDATE_FROM_NESTED_JOIN_NOT_SUPPORTED:
266            case UPDATE_FROM_SUBQUERY_NOT_SUPPORTED:
267            case UPDATE_JOINED_NOT_SUPPORTED:
268            case UPDATE_JOIN_ON_HAS_SUBQUERY_NOT_SUPPORTED:
269            case UPDATE_ORDER_BY_OR_LIMIT_NOT_SUPPORTED:
270            case UPDATE_OUTPUT_CLAUSE_NOT_SUPPORTED:
271            case UPDATE_RETURNING_CLAUSE_NOT_SUPPORTED:
272            case UPDATE_SET_HAS_SUBQUERY_NOT_SUPPORTED:
273            case UPDATE_TUPLE_ASSIGNMENT_NOT_SUPPORTED:
274            case UPDATE_WHERE_EXISTS_BODY_MISSING:
275            case UPDATE_WHERE_EXISTS_CORRELATED_UNKNOWN_OUTER_ALIAS:
276            case UPDATE_WHERE_EXISTS_INNER_RELATION_UNKNOWN:
277            case UPDATE_WHERE_OUTER_SHAPE_REJECTED:
278            case UPDATE_WHERE_PREDICATE_GENERIC_NOT_SUPPORTED:
279            case UPDATE_WHERE_PREDICATE_NOT_LIFTABLE:
280            case UPDATE_WHERE_PREDICATE_NOT_NOT_SUPPORTED:
281            case UPDATE_WHERE_PREDICATE_SCALAR_COMPARISON_NOT_LIFTABLE:
282            case USING_IN_BODY_NOT_SUPPORTED:
283            case WHERE_HAS_SUBQUERY_NOT_SUPPORTED:
284            case WINDOW_CLUSTER_BY_NOT_SUPPORTED:
285            case WINDOW_DISTRIBUTE_BY_NOT_SUPPORTED:
286            case WINDOW_EMPTY_OVER_NOT_SUPPORTED:
287            case WINDOW_FILTER_NOT_SUPPORTED:
288            case WINDOW_FRAME_EXCLUDE_NOT_SUPPORTED:
289            case WINDOW_FRAME_NULL_BOUNDARY_TYPE:
290            case WINDOW_FRAME_NULL_LIMIT_ROW_TYPE:
291            case WINDOW_FRAME_NULL_START_BOUNDARY:
292            case WINDOW_FRAME_OFFSET_NON_CONSTANT:
293            case WINDOW_FRAME_UNEXPECTED_OFFSET:
294            case WINDOW_FRAME_UNSUPPORTED_BOUNDARY_TYPE:
295            case WINDOW_FRAME_UNSUPPORTED_LIMIT_ROW_TYPE:
296            case WINDOW_FUNCTION_AS_PROJECTION_NOT_SUPPORTED:
297            case WINDOW_FUNCTION_EMBEDDED_NOT_SUPPORTED:
298            case WINDOW_FUNCTION_LEVEL_ORDER_BY_NOT_SUPPORTED:
299            case WINDOW_FUNCTION_LEVEL_SORT_NOT_SUPPORTED:
300            case WINDOW_FUNCTION_UNSUPPORTED:
301            case WINDOW_FUNCTION_USED_NOT_SUPPORTED:
302            case WINDOW_KEEP_DENSE_RANK_NOT_SUPPORTED:
303            case WINDOW_NAMED_WINDOW_DECLARATION_NOT_SUPPORTED:
304            case WINDOW_NAMED_WINDOW_REFERENCE_NOT_SUPPORTED:
305            case WINDOW_OVER_ORDER_BY_AGGREGATE:
306            case WINDOW_OVER_ORDER_BY_CALCULATED_ALIAS:
307            case WINDOW_OVER_ORDER_BY_ITEM_UNUSABLE:
308            case WINDOW_OVER_ORDER_BY_LITERAL:
309            case WINDOW_OVER_ORDER_BY_NULL_SORT_KEY:
310            case WINDOW_OVER_ORDER_BY_RESET_WHEN_NOT_SUPPORTED:
311            case WINDOW_OVER_ORDER_BY_SIBLINGS_NOT_SUPPORTED:
312            case WINDOW_OVER_ORDER_BY_SUBQUERY:
313            case WINDOW_OVER_ORDER_BY_UNKNOWN_REFERENCE:
314            case WINDOW_OVER_ORDER_BY_WINDOW_FUNCTION:
315            case WINDOW_PARTITION_BY_AGGREGATE:
316            case WINDOW_PARTITION_BY_CALCULATED_ALIAS:
317            case WINDOW_PARTITION_BY_ITEM_UNUSABLE:
318            case WINDOW_PARTITION_BY_LITERAL:
319            case WINDOW_PARTITION_BY_PROJECTION_ALIAS:
320            case WINDOW_PARTITION_BY_SORT_NOT_SUPPORTED:
321            case WINDOW_PARTITION_BY_SUBQUERY:
322            case WINDOW_PARTITION_BY_UNKNOWN_REFERENCE:
323            case WINDOW_SORT_BY_NOT_SUPPORTED:
324            case WINDOW_WITHIN_GROUP_INSIDE_PROJECTION_NOT_SUPPORTED:
325            case WINDOW_WITHIN_GROUP_NOT_SUPPORTED:
326                return DiagnosticCategory.LOWERING_UNSUPPORTED;
327
328            default:
329                throw new IllegalArgumentException(
330                        "Unclassified DiagnosticCode: " + code.name());
331        }
332    }
333
334    /**
335     * Recovery boundaries for unsupported nested blocks must not absorb
336     * malformed source SQL or turn a dialect error into a successful warning.
337     */
338    public static boolean isUnsupportedNestedBlockRecoverable(Diagnostic diagnostic) {
339        if (diagnostic == null) {
340            throw new NullPointerException("diagnostic");
341        }
342        return diagnostic.getCategory() == DiagnosticCategory.LOWERING_UNSUPPORTED;
343    }
344
345    /** Return true only when a non-empty diagnostic set is wholly recoverable. */
346    public static boolean isUnsupportedNestedBlockRecoverable(
347            Iterable<Diagnostic> diagnostics) {
348        if (diagnostics == null) {
349            throw new NullPointerException("diagnostics");
350        }
351        boolean found = false;
352        for (Diagnostic diagnostic : diagnostics) {
353            found = true;
354            if (!isUnsupportedNestedBlockRecoverable(diagnostic)) return false;
355        }
356        return found;
357    }
358}