[ 
https://issues.apache.org/jira/browse/THRIFT-897?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12908172#action_12908172
 ] 

Jeff DeCew edited comment on THRIFT-897 at 9/10/10 4:24 PM:
------------------------------------------------------------

What would be the cost of doing type resolution?  I think this might be the 
most convenient (and backward-compatible) behavior, but I have no idea if it is 
feasible in the current architecture of the compiler.

This is my proposal:

{code}
enum MyEnum {
 A = 1
 X = 2
}
enum OtherEnum {
 B = 1
 X = 2
}

// Automatically resolve A to MyEnum.A and allow to compile
const MyEnum myConst1 = A;

// Automatically resolve B to MyEnum.B and FAIL to compile because MyEnum.B 
does not exist
const MyEnum myConst2 = B;

// Allow to compile
const MyEnum myConst3 = OtherEnum.B;

// Allow to compile
const MyEnum myConst4 = MyEnum.A;

// Automatically resolve X to MyEnum.X and allow to compile (but maybe warn 
that X was ambiguously resolved)
const MyEnum myConst5 = X;

// Can't automatically resolve A (even though it is unique), FAIL to compile
const i32 myConst6 = A;
{code}


      was (Author: jdecew):
    What would be the cost of doing type resolution?  I think this might be the 
most convenient (and backward-compatible) behavior, but I have no idea if it is 
feasible in the current architecture of the compiler.

This is my proposal:

{code}
enum MyEnum {
 A = 1
 X = 2
}
enum OtherEnum {
 B = 1
 X = 2
}

// Automatically resolve A to MyEnum.A and allow to compile
const MyEnum myConst1 = A;

// Automatically resolve B to MyEnum.B and FAIL to compile because MyEnum.B 
does not exist
const MyEnum myConst2 = B;

// Allow to compile
const MyEnum myConst3 = OtherEnum.B;

// Allow to compile
const MyEnum myConst4 = MyEnum.A;

// Automatically resolve X to MyEnum.X and allow to compile (but maybe warn 
that X was ambiguously resolved)
const MyEnum myConst5 = X;
{code}

  
> Don't allow unqualified constant access to enum values
> ------------------------------------------------------
>
>                 Key: THRIFT-897
>                 URL: https://issues.apache.org/jira/browse/THRIFT-897
>             Project: Thrift
>          Issue Type: Bug
>          Components: Compiler (General)
>    Affects Versions: 0.1, 0.2, 0.3, 0.4
>            Reporter: Bryan Duxbury
>             Fix For: 0.5
>
>
> Through looking at THRIFT-544 and THRIFT-895, it's come to my attention that 
> we currently register each of every enum's values as a global (and scoped) 
> constant. This allows you to do things like:
> {code}
> enum MyEnum {
>  A = 1
>  B = 2
> }
> const MyEnum myEnumVar = A;
> {code}
> This is handy, insofar as you might want to use the values of an enum in 
> constant or default circumstances. However, this behavior is unstable - if 
> you have two enums with values that have the same name, all constant 
> references will point at the last occurrence of the name. Further, in order 
> to allow this to go on, we must not check if any constant has been declared 
> twice, which means you can get stupid, detectable errors in your IDL very 
> easily.
> I propose that we stop allowing this method of access, and instead require 
> the enum values referenced in constant context to be prefixed with the enum 
> type's name. For instance:
> {code}
> enum MyEnum {
>  A = 1
>  B = 2
> }
> const MyEnum myEnumVar = MyEnum.A;
> {code}

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to