Skip to content

Commit 733c00c

Browse files
authored
Add a specific issue type for fragment cycles (#6759)
* Add a specific type for fragment cycles See #6756 * update apiDump * update test fixtures
1 parent 1a2991e commit 733c00c

File tree

5 files changed

+25
-2
lines changed

5 files changed

+25
-2
lines changed

libraries/apollo-ast/api/apollo-ast.api

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,12 @@ public final class com/apollographql/apollo/ast/ForeignSchema {
132132
public final fun getVersion ()Ljava/lang/String;
133133
}
134134

135+
public final class com/apollographql/apollo/ast/FragmentCycle : com/apollographql/apollo/ast/GraphQLValidationIssue {
136+
public fun <init> (Ljava/lang/String;Lcom/apollographql/apollo/ast/SourceLocation;)V
137+
public fun getMessage ()Ljava/lang/String;
138+
public fun getSourceLocation ()Lcom/apollographql/apollo/ast/SourceLocation;
139+
}
140+
135141
public final class com/apollographql/apollo/ast/GQLArgument : com/apollographql/apollo/ast/GQLNamed, com/apollographql/apollo/ast/GQLNode {
136142
public fun <init> (Lcom/apollographql/apollo/ast/SourceLocation;Ljava/lang/String;Lcom/apollographql/apollo/ast/GQLValue;)V
137143
public synthetic fun <init> (Lcom/apollographql/apollo/ast/SourceLocation;Ljava/lang/String;Lcom/apollographql/apollo/ast/GQLValue;ILkotlin/jvm/internal/DefaultConstructorMarker;)V

libraries/apollo-ast/api/apollo-ast.klib.api

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,15 @@ final class com.apollographql.apollo.ast/ForeignSchema { // com.apollographql.ap
238238
final fun <get-version>(): kotlin/String // com.apollographql.apollo.ast/ForeignSchema.version.<get-version>|<get-version>(){}[0]
239239
}
240240

241+
final class com.apollographql.apollo.ast/FragmentCycle : com.apollographql.apollo.ast/GraphQLValidationIssue { // com.apollographql.apollo.ast/FragmentCycle|null[0]
242+
constructor <init>(kotlin/String, com.apollographql.apollo.ast/SourceLocation?) // com.apollographql.apollo.ast/FragmentCycle.<init>|<init>(kotlin.String;com.apollographql.apollo.ast.SourceLocation?){}[0]
243+
244+
final val message // com.apollographql.apollo.ast/FragmentCycle.message|{}message[0]
245+
final fun <get-message>(): kotlin/String // com.apollographql.apollo.ast/FragmentCycle.message.<get-message>|<get-message>(){}[0]
246+
final val sourceLocation // com.apollographql.apollo.ast/FragmentCycle.sourceLocation|{}sourceLocation[0]
247+
final fun <get-sourceLocation>(): com.apollographql.apollo.ast/SourceLocation? // com.apollographql.apollo.ast/FragmentCycle.sourceLocation.<get-sourceLocation>|<get-sourceLocation>(){}[0]
248+
}
249+
241250
final class com.apollographql.apollo.ast/GQLArgument : com.apollographql.apollo.ast/GQLNamed, com.apollographql.apollo.ast/GQLNode { // com.apollographql.apollo.ast/GQLArgument|null[0]
242251
constructor <init>(com.apollographql.apollo.ast/SourceLocation? = ..., kotlin/String, com.apollographql.apollo.ast/GQLValue) // com.apollographql.apollo.ast/GQLArgument.<init>|<init>(com.apollographql.apollo.ast.SourceLocation?;kotlin.String;com.apollographql.apollo.ast.GQLValue){}[0]
243252

libraries/apollo-ast/src/commonMain/kotlin/com/apollographql/apollo/ast/Issue.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,13 @@ class DifferentShape(override val message: String, override val sourceLocation:
7070

7171
class UnusedFragment(override val message: String, override val sourceLocation: SourceLocation?) : GraphQLValidationIssue
7272

73+
/**
74+
* There is a fragment cycle.
75+
*
76+
* See https://spec.graphql.org/September2025/#sec-Fragment-Spreads-Must-Not-Form-Cycles
77+
*/
78+
class FragmentCycle(override val message: String, override val sourceLocation: SourceLocation?) : GraphQLValidationIssue
79+
7380
/**
7481
* Two type definitions have the same name
7582
*/

libraries/apollo-ast/src/commonMain/kotlin/com/apollographql/apollo/ast/internal/ExecutableValidationScope.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import com.apollographql.apollo.ast.Catch
66
import com.apollographql.apollo.ast.DeprecatedUsage
77
import com.apollographql.apollo.ast.DifferentShape
88
import com.apollographql.apollo.ast.ExecutableValidationResult
9+
import com.apollographql.apollo.ast.FragmentCycle
910
import com.apollographql.apollo.ast.GQLArgument
1011
import com.apollographql.apollo.ast.GQLBooleanValue
1112
import com.apollographql.apollo.ast.GQLDirective
@@ -117,7 +118,7 @@ internal class ExecutableValidationScope(
117118
val index = path.indexOf("__${name}")
118119
val nextPath = path + "__${fragment.name}"
119120
if (index != -1) {
120-
registerIssue("Fragment '$name' spreads itself, creating a cycle at '${nextPath.subList(index, nextPath.size).joinToString(".")}'", it.sourceLocation)
121+
issues.add(FragmentCycle("Fragment '$name' spreads itself, creating a cycle at '${nextPath.subList(index, nextPath.size).joinToString(".")}'", it.sourceLocation))
121122
cyclicFragments.add(name)
122123
return@forEach
123124
}

libraries/apollo-compiler/src/test/validation/operation/CircularFragmentReference.expected

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)