import java.io.File; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Arrays; import com.adacore.libadalang.Libadalang; /** * Test that auto providers work as expected */ public class AutoProvider { private static void doTest(String[] args, String charset) { final String projectPath = args[0]; final String sourceA = Paths.get(projectPath, "a.ads").toString(); final String sourceC = Paths.get(projectPath, "c.ads").toString(); final String sourceD = Paths.get(projectPath, "d.ads").toString(); // Create an auto provider with sources A and C and D: // * B is not included on purpose to assert that nameres fails when a // dependency is missing. // * D designates a source file that does not exist. For now, no error // are emitted, but the program doesn't crash. try ( final Libadalang.UnitProvider unitProvider = Libadalang.createAutoProvider( new String[] {sourceA, sourceC, sourceD}, charset ); final Libadalang.AnalysisContext context = Libadalang.AnalysisContext.create( null, null, unitProvider, null, true, 8 ) ) { final Libadalang.AnalysisUnit unit = context.getUnitFromFile(sourceC); final Libadalang.CompilationUnit root = (Libadalang.CompilationUnit) unit.getRoot(); final Libadalang.PackageDecl pkg = (Libadalang.PackageDecl) root.pDecl(); final Libadalang.AdaNodeList decls = (Libadalang.AdaNodeList) pkg.fPublicPart().fDecls(); // Resolve the type of the two object declarations inside package // C: one of them refers to a type declared in package A (so // should resolve correctly), while the other refers to a type // declared in package B which is not part of the auto provider, // thus should fail to resolve. for (int i = 0; i < decls.getChildrenCount(); ++i) { final Libadalang.ObjectDecl obj = (Libadalang.ObjectDecl) decls.getChild(i); final Libadalang.BaseTypeDecl type = obj.fTypeExpr().pDesignatedTypeDecl(); System.out.println(obj + " has type " + type); } } } public static void main(String[] args) { System.out.println("Using null charset:"); doTest(args, null); System.out.println("Using utf-8 charset:"); doTest(args, "utf-8"); } }