Skip to content

Commit

Permalink
resolve: save dependencies in GeneralizedVar; print cycle
Browse files Browse the repository at this point in the history
  • Loading branch information
mio-19 committed Jan 17, 2025
1 parent fb113b6 commit b64eaee
Show file tree
Hide file tree
Showing 5 changed files with 34 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,17 +8,21 @@
import org.aya.syntax.ref.GeneralizedVar;
import org.aya.util.error.SourcePos;
import org.jetbrains.annotations.NotNull;
import kala.collection.immutable.ImmutableSeq;

public record CyclicDependencyError(

Check warning on line 13 in base/src/main/java/org/aya/resolve/error/CyclicDependencyError.java

View check run for this annotation

Codecov / codecov/patch

base/src/main/java/org/aya/resolve/error/CyclicDependencyError.java#L13

Added line #L13 was not covered by tests
@NotNull SourcePos sourcePos,
@NotNull GeneralizedVar var
@NotNull GeneralizedVar var,
@NotNull ImmutableSeq<GeneralizedVar> cyclePath
) implements Problem {
@Override public @NotNull Severity level() { return Severity.ERROR; }
@Override public @NotNull Stage stage() { return Stage.RESOLVE; }

Check warning on line 19 in base/src/main/java/org/aya/resolve/error/CyclicDependencyError.java

View check run for this annotation

Codecov / codecov/patch

base/src/main/java/org/aya/resolve/error/CyclicDependencyError.java#L18-L19

Added lines #L18 - L19 were not covered by tests
@Override public @NotNull Doc describe(@NotNull PrettierOptions options) {
return Doc.sep(
Doc.plain("Cyclic dependency detected in variable declaration:"),
Doc.plain(var.name())
return Doc.vcat(
Doc.plain("Cyclic dependency detected in variable declarations:"),
Doc.plain(String.join(" -> ", cyclePath.view()
.map(GeneralizedVar::name)
.toImmutableSeq()))

Check warning on line 25 in base/src/main/java/org/aya/resolve/error/CyclicDependencyError.java

View check run for this annotation

Codecov / codecov/patch

base/src/main/java/org/aya/resolve/error/CyclicDependencyError.java#L21-L25

Added lines #L21 - L25 were not covered by tests
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,10 @@
* if it’s not in the allowedGeneralizes map.
*/
public final class VariableDependencyCollector {
private final Map<GeneralizedVar, ImmutableSeq<GeneralizedVar>> dependencies = new HashMap<>();
private final Reporter reporter;
private final MutableSet<GeneralizedVar> visiting = MutableSet.create();
private final MutableSet<GeneralizedVar> visited = MutableSet.create();
private final MutableList<GeneralizedVar> currentPath = MutableList.create();

public VariableDependencyCollector(Reporter reporter) {
this.reporter = reporter;
Expand All @@ -46,26 +46,29 @@ public VariableDependencyCollector(Reporter reporter) {
public void registerVariable(GeneralizedVar var) {
if (visited.contains(var)) return;

// If var is already being visited in current DFS path, we found a cycle
if (!visiting.add(var)) {
reporter.report(new CyclicDependencyError(var.sourcePos(), var));
// Find cycle start index
var cycleStart = currentPath.indexOf(var);
var cyclePath = currentPath.view().drop(cycleStart).appended(var);
reporter.report(new CyclicDependencyError(var.sourcePos(), var, cyclePath.toImmutableSeq()));
throw new Context.ResolvingInterruptedException();

Check warning on line 54 in base/src/main/java/org/aya/resolve/visitor/VariableDependencyCollector.java

View check run for this annotation

Codecov / codecov/patch

base/src/main/java/org/aya/resolve/visitor/VariableDependencyCollector.java#L51-L54

Added lines #L51 - L54 were not covered by tests
}

currentPath.append(var);
var deps = collectReferences(var);
dependencies.put(var, deps);
var.setDependencies(deps);

// Recursively register dependencies
for (var dep : deps) {
registerVariable(dep);
}

Check warning on line 63 in base/src/main/java/org/aya/resolve/visitor/VariableDependencyCollector.java

View check run for this annotation

Codecov / codecov/patch

base/src/main/java/org/aya/resolve/visitor/VariableDependencyCollector.java#L62-L63

Added lines #L62 - L63 were not covered by tests

currentPath.removeLast();
visiting.remove(var);
visited.add(var);
}

public ImmutableSeq<GeneralizedVar> getDependencies(GeneralizedVar var) {
return dependencies.getOrDefault(var, ImmutableSeq.empty());
return var.getDependencies();
}

private ImmutableSeq<GeneralizedVar> collectReferences(GeneralizedVar var) {
Expand Down
4 changes: 4 additions & 0 deletions cli-impl/src/test/java/org/aya/test/fixtures/ScopeError.java
Original file line number Diff line number Diff line change
Expand Up @@ -103,4 +103,8 @@ def test (A : Type) (a : A) : A =>
| x : A := a
in x
""";
@Language("Aya") String testCyclicDependency = """
variable A : B
variable B : A
""";
}
3 changes: 3 additions & 0 deletions cli-impl/src/test/resources/negative/ScopeError.txt
Original file line number Diff line number Diff line change
Expand Up @@ -318,3 +318,6 @@ That looks right!
LocalShadowSuppress:
That looks right!

CyclicDependency:
That looks right!

10 changes: 10 additions & 0 deletions syntax/src/main/java/org/aya/syntax/ref/GeneralizedVar.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,17 +6,27 @@
import org.aya.util.error.SourceNode;
import org.aya.util.error.SourcePos;
import org.jetbrains.annotations.NotNull;
import kala.collection.immutable.ImmutableSeq;

public final class GeneralizedVar implements AnyVar, SourceNode {
public final @NotNull String name;
public final @NotNull SourcePos sourcePos;
public Generalize owner;
private @NotNull ImmutableSeq<GeneralizedVar> dependencies = ImmutableSeq.empty();

public GeneralizedVar(@NotNull String name, @NotNull SourcePos sourcePos) {
this.name = name;
this.sourcePos = sourcePos;
}

public void setDependencies(@NotNull ImmutableSeq<GeneralizedVar> deps) {
this.dependencies = deps;
}

public @NotNull ImmutableSeq<GeneralizedVar> getDependencies() {
return dependencies;
}

public @NotNull LocalVar toLocal() {
return new LocalVar(name, sourcePos, new GenerateKind.Generalized(this));
}
Expand Down

0 comments on commit b64eaee

Please sign in to comment.