pulumi/pkg/tokens/constants.go
joeduffy 32960be0fb Use export tables
This change redoes the way module exports are represented.  The old
mechanism -- although laudible for its attempt at consistency -- was
wrong.  For example, consider this case:

    let v = 42;
    export { v };

The old code would silently add *two* members, both with the name "v",
one of which would be dropped since the entries in the map collided.

It would be easy enough just to detect collisions, and update the
above to mark "v" as public, when the export was encountered.  That
doesn't work either, as the following two examples demonstrate:

    let v = 42;
    export { v as w };
    let x = w; // error!

This demonstrates:

    * Exporting "v" with a different name, "w" to consumers of the
      module.  In particular, it should not be possible for module
      consumers to access the member through the name "v".

    * An inability to access the exported name "w" from within the
      module itself.  This is solely for external consumption.

Because of this, we will use an export table approach.  The exports
live alongside the members, and we are smart about when to consult
the export table, versus the member table, during name binding.
2017-02-13 09:56:25 -08:00

32 lines
1.1 KiB
Go

// Copyright 2016 Marapongo, Inc. All rights reserved.
package tokens
// Accessibility determines the visibility of a class member.
type Accessibility string
// Accessibility modifiers.
const (
PublicAccessibility Accessibility = "public"
PrivateAccessibility Accessibility = "private"
ProtectedAccessibility Accessibility = "protected"
)
// Special module names.
const (
DefaultModule ModuleName = ".default" // used to reference the default module.
)
// Special variable names.
const (
ThisVariable Name = ".this" // the current object (for class methods).
SuperVariable Name = ".super" // the parent class object (for class methods).
)
// Special function names.
const (
EntryPointFunction ModuleMemberName = ".main" // the special package entrypoint function.
ModuleInitFunction ModuleMemberName = ".init" // the special module initialization function.
ClassConstructorFunction ClassMemberName = ".ctor" // the special class instance constructor function.
ClassInitFunction ClassMemberName = ".init" // the special class initialization function.
)