/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.internal.gosu.ir.transform.util;
import gw.lang.parser.IReducedSymbol;
import gw.lang.reflect.IRelativeTypeInfo;
import gw.lang.reflect.Modifier;
import gw.lang.reflect.IAttributedFeatureInfo;
import gw.lang.reflect.IType;
import gw.lang.reflect.java.IJavaClassMethod;
import gw.lang.reflect.java.IJavaType;
import gw.lang.reflect.java.JavaTypes;
import gw.lang.reflect.gs.BytecodeOptions;
import gw.lang.parser.ISymbol;
import gw.internal.gosu.parser.Symbol;
import java.lang.reflect.Method;
public class AccessibilityUtil {
public static IRelativeTypeInfo.Accessibility forMethod(Method method) {
if (Modifier.isPublic(method.getModifiers())) {
return IRelativeTypeInfo.Accessibility.PUBLIC;
} else if (Modifier.isProtected(method.getModifiers())) {
return IRelativeTypeInfo.Accessibility.PROTECTED;
} else if (Modifier.isPrivate(method.getModifiers())) {
return IRelativeTypeInfo.Accessibility.PRIVATE;
} else {
return IRelativeTypeInfo.Accessibility.INTERNAL;
}
}
public static IRelativeTypeInfo.Accessibility forMethod(IJavaClassMethod method) {
if (Modifier.isPublic(method.getModifiers())) {
return IRelativeTypeInfo.Accessibility.PUBLIC;
} else if (Modifier.isProtected(method.getModifiers())) {
return IRelativeTypeInfo.Accessibility.PROTECTED;
} else if (Modifier.isPrivate(method.getModifiers())) {
return IRelativeTypeInfo.Accessibility.PRIVATE;
} else {
return IRelativeTypeInfo.Accessibility.INTERNAL;
}
}
public static IRelativeTypeInfo.Accessibility forFeatureInfo(IAttributedFeatureInfo feature) {
if (feature.isPublic()) {
return IRelativeTypeInfo.Accessibility.PUBLIC;
} else if (feature.isProtected()) {
return IRelativeTypeInfo.Accessibility.PROTECTED;
} else if (feature.isPrivate()) {
return IRelativeTypeInfo.Accessibility.PRIVATE;
} else {
return IRelativeTypeInfo.Accessibility.INTERNAL;
}
}
public static IRelativeTypeInfo.Accessibility forSymbol(IReducedSymbol symbol) {
if (symbol.isPublic()) {
return IRelativeTypeInfo.Accessibility.PUBLIC;
} else if (symbol.isProtected()) {
return IRelativeTypeInfo.Accessibility.PROTECTED;
} else if (symbol.isPrivate()) {
return IRelativeTypeInfo.Accessibility.PRIVATE;
} else {
return IRelativeTypeInfo.Accessibility.INTERNAL;
}
}
public static IRelativeTypeInfo.Accessibility forCapturedVar() {
if (BytecodeOptions.isSingleServingLoader()) {
return IRelativeTypeInfo.Accessibility.PUBLIC;
} else {
return IRelativeTypeInfo.Accessibility.PRIVATE;
}
}
public static IRelativeTypeInfo.Accessibility forTypeParameter() {
if (BytecodeOptions.isSingleServingLoader()) {
return IRelativeTypeInfo.Accessibility.PUBLIC;
} else {
return IRelativeTypeInfo.Accessibility.INTERNAL;
}
}
public static IRelativeTypeInfo.Accessibility forOuter() {
if (BytecodeOptions.isSingleServingLoader()) {
return IRelativeTypeInfo.Accessibility.PUBLIC;
} else {
return IRelativeTypeInfo.Accessibility.INTERNAL;
}
}
public static IRelativeTypeInfo.Accessibility forOuterAccess() {
if (BytecodeOptions.isSingleServingLoader()) {
return IRelativeTypeInfo.Accessibility.PUBLIC;
} else {
return IRelativeTypeInfo.Accessibility.INTERNAL;
}
}
public static IRelativeTypeInfo.Accessibility forType( IType type ) {
int modifiers = type.getModifiers();
if ( Modifier.isPublic(modifiers) ) {
return IRelativeTypeInfo.Accessibility.PUBLIC;
} else if ( Modifier.isInternal( modifiers ) ) {
return IRelativeTypeInfo.Accessibility.INTERNAL;
} else if ( Modifier.isPrivate( modifiers ) ) {
return IRelativeTypeInfo.Accessibility.PRIVATE;
} else {
if ( type instanceof IJavaType ) {
// Java types default to internal access if no modifiers are present
return IRelativeTypeInfo.Accessibility.INTERNAL;
} else {
// All other types should be considered to default to public access
return IRelativeTypeInfo.Accessibility.PUBLIC;
}
}
}
}