Ejemplo n.º 1
0
class ErrorUseClause(FooNode):
    @langkit_property()
    def resolve():
        return PropertyError(T.LexicalEnv, "unconditionally raised")

    env_spec = EnvSpec(
        handle_children(),
        reference(Self.cast(T.FooNode).singleton, T.ErrorUseClause.resolve))
Ejemplo n.º 2
0
class RefClause(FooNode):
    ref_id = Field(type=T.Id)

    env_spec = EnvSpec(
        reference(
            nodes=[Self.ref_id.cast(T.FooNode)],
            through=T.FooNode.children_env,
            dest_env=(Self.ref_id.resolve(
                Self.parent.children_env).children_env),
        ))
Ejemplo n.º 3
0
class UseClause(FooNode):
    name = Field(type=T.Id)

    @langkit_property()
    def resolve():
        return Self.name.resolve().map(lambda n: n.children_env).env_group()

    env_spec = EnvSpec(
        handle_children(),
        reference(Self.cast(T.FooNode).singleton, T.UseClause.resolve))
Ejemplo n.º 4
0
class Example(FooNode):
    token_node = True

    @langkit_property()
    def resolve():
        return PropertyError(T.LexicalEnv)

    env_spec = EnvSpec(
        add_env(),
        reference([Self.cast(FooNode), Self.cast(FooNode)], T.Example.resolve),
    )
Ejemplo n.º 5
0
class Open(Item):
    name = Field(type=T.Identifier)

    env_spec = EnvSpec(
        reference(nodes=[Self.cast(T.FooNode)], through=T.Open.resolve),
    )

    @langkit_property(return_type=T.LexicalEnv)
    def resolve():
        n = Var(Self.name.resolve())
        return n.then(lambda n: n.children_env, No(T.LexicalEnv))
Ejemplo n.º 6
0
class Example(FooNode):
    token_node = True

    env_spec = EnvSpec(
        add_env(),
        reference([Self.parent.cast(Def).cat1.cast(T.FooNode)],
                  T.FooNode.children_env,
                  category='cat1'),
        reference([Self.parent.cast(Def).cat2.cast(T.FooNode)],
                  T.FooNode.children_env,
                  category='cat2'))

    @langkit_property(public=True)
    def lookup_all(name=T.Symbol):
        return Self.children_env.get(name)

    @langkit_property(public=True)
    def lookup_1(name=T.Symbol):
        return Self.children_env.get(name, categories=RefCategories(cat1=True))

    @langkit_property(public=True)
    def lookup_2(name=T.Symbol):
        return Self.children_env.get(name, categories=RefCategories(cat2=True))
Ejemplo n.º 7
0
class Def(FooNode):
    name = Field()
    imports = Field()
    vars = Field()
    expr = Field()

    env_spec = EnvSpec(
        add_to_env(mappings=New(T.env_assoc, key=Self.name.symbol, val=Self)),
        add_env(),
        reference(Self.imports.map(lambda i: i.cast(T.FooNode)),

                  # If PropertyDef rewriting omits the following references,
                  # env lookup will never reach DerivedRef.referenced_env, so
                  # resolution will sometimes fail to reach definition.
                  T.MiddleRef.referenced_env)
    )
Ejemplo n.º 8
0
class UseClause(Decl):
    name = Field()
    env_spec = EnvSpec(
        reference(Self.name.cast(FooNode)._.singleton,
                  through=Name.designated_env,
                  kind=RefKind.transitive))
Ejemplo n.º 9
0
class PackageBody(FooNode):
    name = Field(type=T.Name)
    decls = Field(type=T.DeclarativePart)

    @langkit_property(return_type=T.Name)
    def self_name():
        return Self.name

    @langkit_property(return_type=T.LexicalEnv)
    def body_decl_scope():
        """
        Assuming this PackageBody is not in the top-level list, return the
        environment of its PackageDecl that it should reference.
        """
        pkg_decl = Var(Self.lookup_decl_part)
        return If(
            pkg_decl.private_part.is_null,
            pkg_decl.children_env,
            pkg_decl.private_part.children_env
        )

    @langkit_property(return_type=T.PackageDecl)
    def lookup_decl_part():
        """
        Assuming this PackageBody is not in the top-level list, return the
        the corresponding package declaration.
        """
        return (
            Self.parent.children_env.get_first(Self.name.base_name.to_symbol)
            .cast(T.PackageDecl).node
        )

    env_spec = EnvSpec(
        # The initial environment for package bodies is the private part of the
        # corresponding package specs (or the public part if there is no
        # private part).
        set_initial_env_by_name(
            If(
                Self.is_toplevel,
                Self.suffixed_full_name(String('__privatepart')).to_symbol,
                No(T.Symbol),
            ),
            Self.parent.children_env,
        ),

        add_to_env_by_name(
            '__nextpart',
            Self,
            If(Self.can_have_name,
               Self.suffixed_full_name(String('__privatepart')).to_symbol,
               No(T.Symbol)),
            Self.body_decl_scope,
        ),

        add_env(names=[Self.suffixed_full_name(String('__body')).to_symbol]),

        reference(
            Self.cast(FooNode).singleton,
            through=T.PackageBody.body_decl_scope,
            cond=Not(Self.is_toplevel),
            kind=RefKind.prioritary,
        ),
    )

    @langkit_property(return_type=T.PackageDecl.entity, public=True)
    def decl_part():
        """
        Return the PackageDecl node corresponding to this PackageBody.
        """
        env = Var(Self.parent.children_env)
        return Self.name.resolve(env).cast(T.PackageDecl)
Ejemplo n.º 10
0
class Using(FooNode):
    name = Field()
    env_spec = EnvSpec(
        reference(Self.name.cast(FooNode)._.singleton,
                  through=Name.designated_env)
    )