Skip to content

Commit

Permalink
[lang] Add static default visibility computation from EClass.
Browse files Browse the repository at this point in the history
see #640

Signed-off-by: Stéphane Galland <galland@arakhne.org>
  • Loading branch information
gallandarakhneorg committed Apr 24, 2017
1 parent 78cf4d2 commit 4bc7c3e
Show file tree
Hide file tree
Showing 8 changed files with 175 additions and 68 deletions.
Expand Up @@ -24,8 +24,13 @@
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import javax.inject.Inject;

import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtend.core.xtend.XtendPackage;
import org.eclipse.xtend.core.xtend.impl.XtendMemberImplCustom;
import org.eclipse.xtext.common.types.JvmIdentifiableElement;
import org.eclipse.xtext.common.types.JvmVisibility;

/** Provide the default visibility modifier for elements.
Expand All @@ -39,27 +44,73 @@ public class DefaultVisibilityProvider implements IDefaultVisibilityProvider {

private final Method visiblityMethod;

@Inject
private SarlJvmModelAssociations associations;

/** Constructor.
*/
public DefaultVisibilityProvider() {
try {
this.visiblityMethod = XtendMemberImplCustom.class.getDeclaredMethod("getDefaultVisibility"); //$NON-NLS-1$
this.visiblityMethod.setAccessible(true);
} catch (NoSuchMethodException | SecurityException exception) {
throw new RuntimeException(exception);
}
}

@Override
public JvmVisibility getDefaultJvmVisibility(EObject element) {
if (element instanceof XtendMemberImplCustom) {
this.visiblityMethod.setAccessible(true);
EObject realObject = element;
if (realObject instanceof JvmIdentifiableElement) {
final EObject obj = this.associations.getPrimarySourceElement(realObject);
if (obj != null) {
realObject = obj;
}
}
if (realObject instanceof XtendMemberImplCustom) {
try {
return (JvmVisibility) this.visiblityMethod.invoke(element);
return (JvmVisibility) this.visiblityMethod.invoke(realObject);
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException exception) {
throw new RuntimeException(exception);
}
}
return JvmVisibility.DEFAULT;
}

@Override
@SuppressWarnings("checkstyle:npathcomplexity")
public JvmVisibility getDefaultJvmVisibility(EObject container, EClass element) {
EObject realObject = container;
if (realObject instanceof JvmIdentifiableElement) {
final EObject obj = this.associations.getPrimarySourceElement(realObject);
if (obj != null) {
realObject = obj;
}
}
if (realObject != null) {
if (XtendPackage.eINSTANCE.getXtendFunction().isSuperTypeOf(element)) {
return IDefaultVisibilityProvider.getActionDefaultVisibilityIn(realObject);
}
if (XtendPackage.eINSTANCE.getXtendField().isSuperTypeOf(element)) {
return IDefaultVisibilityProvider.getFieldDefaultVisibilityIn(realObject);
}
if (XtendPackage.eINSTANCE.getXtendClass().isSuperTypeOf(element)) {
return IDefaultVisibilityProvider.getClassDefaultVisibilityIn(realObject);
}
if (XtendPackage.eINSTANCE.getXtendInterface().isSuperTypeOf(element)) {
return IDefaultVisibilityProvider.getInterfaceDefaultVisibilityIn(realObject);
}
if (XtendPackage.eINSTANCE.getXtendEnum().isSuperTypeOf(element)) {
return IDefaultVisibilityProvider.getEnumerationDefaultVisibilityIn(realObject);
}
if (XtendPackage.eINSTANCE.getXtendAnnotationType().isSuperTypeOf(element)) {
return IDefaultVisibilityProvider.getAnnotationTypeDefaultVisibilityIn(realObject);
}
if (XtendPackage.eINSTANCE.getXtendMember().isSuperTypeOf(element)) {
return JvmVisibility.PUBLIC;
}
}
return JvmVisibility.DEFAULT;
}

}
Expand Up @@ -24,9 +24,17 @@
import java.util.Objects;

import com.google.inject.ImplementedBy;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtend.core.xtend.XtendAnnotationType;
import org.eclipse.xtend.core.xtend.XtendInterface;
import org.eclipse.xtext.common.types.JvmVisibility;

import io.sarl.lang.sarl.SarlAgent;
import io.sarl.lang.sarl.SarlBehavior;
import io.sarl.lang.sarl.SarlEvent;
import io.sarl.lang.sarl.SarlSkill;

/** Provide the default visibility modifier for elements.
*
* @author $Author: sgalland$
Expand All @@ -39,11 +47,20 @@ public interface IDefaultVisibilityProvider {

/** Replies the default visibility modifier of the given element.
*
* @param element the element
* @param element the element.
* @return the default visibility.
*/
JvmVisibility getDefaultJvmVisibility(EObject element);

/** Replies the default visibility modifier for the given element when it is inside the given container.
*
* @param container the container.
* @param element the element type.
* @return the default visibility.
* @since 0.6
*/
JvmVisibility getDefaultJvmVisibility(EObject container, EClass element);

/** Replies if the given visiblity is the default visibility for the given element.
*
* @param element the element
Expand All @@ -54,4 +71,95 @@ default boolean isDefaultVisibility(EObject element, JvmVisibility visibility) {
return Objects.equals(getDefaultJvmVisibility(element), visibility);
}


/** Replies the default visibility of an action when inside the given container.
*
* @param container the container.
* @return the default visibility.
* @since 0.6
*/
static JvmVisibility getActionDefaultVisibilityIn(EObject container) {
if (container instanceof SarlSkill
|| container instanceof SarlBehavior
|| container instanceof SarlAgent) {
return JvmVisibility.PROTECTED;
}
return JvmVisibility.PUBLIC;
}

/** Replies the default visibility of an annotation type when inside the given container.
*
* @param container the container.
* @return the default visibility.
* @since 0.6
*/
static JvmVisibility getAnnotationTypeDefaultVisibilityIn(EObject container) {
if (container instanceof SarlSkill
|| container instanceof SarlBehavior
|| container instanceof SarlAgent) {
return JvmVisibility.PROTECTED;
}
return JvmVisibility.PUBLIC;
}

/** Replies the default visibility of a class when inside the given container.
*
* @param container the container.
* @return the default visibility.
* @since 0.6
*/
static JvmVisibility getClassDefaultVisibilityIn(EObject container) {
if (container instanceof SarlSkill
|| container instanceof SarlBehavior
|| container instanceof SarlAgent) {
return JvmVisibility.PROTECTED;
}
return JvmVisibility.PUBLIC;
}

/** Replies the default visibility of an enumeration when inside the given container.
*
* @param container the container.
* @return the default visibility.
* @since 0.6
*/
static JvmVisibility getEnumerationDefaultVisibilityIn(EObject container) {
if (container instanceof SarlSkill
|| container instanceof SarlBehavior
|| container instanceof SarlAgent) {
return JvmVisibility.PROTECTED;
}
return JvmVisibility.PUBLIC;
}

/** Replies the default visibility of a field when inside the given container.
*
* @param container the container.
* @return the default visibility.
* @since 0.6
*/
static JvmVisibility getFieldDefaultVisibilityIn(EObject container) {
if (container instanceof SarlEvent
|| container instanceof XtendInterface
|| container instanceof XtendAnnotationType) {
return JvmVisibility.PUBLIC;
}
return JvmVisibility.PRIVATE;
}

/** Replies the default visibility of an interface when inside the given container.
*
* @param container the container.
* @return the default visibility.
* @since 0.6
*/
static JvmVisibility getInterfaceDefaultVisibilityIn(EObject container) {
if (container instanceof SarlSkill
|| container instanceof SarlBehavior
|| container instanceof SarlAgent) {
return JvmVisibility.PROTECTED;
}
return JvmVisibility.PUBLIC;
}

}
Expand Up @@ -21,13 +21,9 @@

package io.sarl.lang.sarl.impl;

import org.eclipse.xtend.core.xtend.XtendTypeDeclaration;
import org.eclipse.xtext.common.types.JvmVisibility;

import io.sarl.lang.sarl.SarlAgent;
import io.sarl.lang.sarl.SarlBehavior;
import io.sarl.lang.sarl.SarlCapacity;
import io.sarl.lang.sarl.SarlSkill;
import io.sarl.lang.jvmmodel.IDefaultVisibilityProvider;

/**
* <!-- begin-user-doc -->
Expand Down Expand Up @@ -59,14 +55,7 @@ protected SarlActionImplCustom() {

@Override
protected JvmVisibility getDefaultVisibility() {
final XtendTypeDeclaration declaration = getDeclaringType();
if (declaration instanceof SarlBehavior || declaration instanceof SarlAgent) {
return JvmVisibility.PROTECTED;
}
if (declaration instanceof SarlSkill || declaration instanceof SarlCapacity) {
return JvmVisibility.PUBLIC;
}
return super.getDefaultVisibility();
return IDefaultVisibilityProvider.getActionDefaultVisibilityIn(getDeclaringType());
}

}
Expand Up @@ -21,12 +21,9 @@

package io.sarl.lang.sarl.impl;

import org.eclipse.xtend.core.xtend.XtendTypeDeclaration;
import org.eclipse.xtext.common.types.JvmVisibility;

import io.sarl.lang.sarl.SarlAgent;
import io.sarl.lang.sarl.SarlBehavior;
import io.sarl.lang.sarl.SarlSkill;
import io.sarl.lang.jvmmodel.IDefaultVisibilityProvider;

/**
* <!-- begin-user-doc -->
Expand Down Expand Up @@ -58,13 +55,7 @@ protected SarlAnnotationTypeImplCustom() {

@Override
protected JvmVisibility getDefaultVisibility() {
final XtendTypeDeclaration declaration = getDeclaringType();
if (declaration instanceof SarlSkill
|| declaration instanceof SarlBehavior
|| declaration instanceof SarlAgent) {
return JvmVisibility.PROTECTED;
}
return super.getDefaultVisibility();
return IDefaultVisibilityProvider.getAnnotationTypeDefaultVisibilityIn(getDeclaringType());
}

}
Expand Up @@ -21,12 +21,9 @@

package io.sarl.lang.sarl.impl;

import org.eclipse.xtend.core.xtend.XtendTypeDeclaration;
import org.eclipse.xtext.common.types.JvmVisibility;

import io.sarl.lang.sarl.SarlAgent;
import io.sarl.lang.sarl.SarlBehavior;
import io.sarl.lang.sarl.SarlSkill;
import io.sarl.lang.jvmmodel.IDefaultVisibilityProvider;

/**
* <!-- begin-user-doc -->
Expand Down Expand Up @@ -58,13 +55,7 @@ protected SarlClassImplCustom() {

@Override
protected JvmVisibility getDefaultVisibility() {
final XtendTypeDeclaration declaration = getDeclaringType();
if (declaration instanceof SarlSkill
|| declaration instanceof SarlBehavior
|| declaration instanceof SarlAgent) {
return JvmVisibility.PROTECTED;
}
return super.getDefaultVisibility();
return IDefaultVisibilityProvider.getClassDefaultVisibilityIn(getDeclaringType());
}

}
Expand Up @@ -21,12 +21,9 @@

package io.sarl.lang.sarl.impl;

import org.eclipse.xtend.core.xtend.XtendTypeDeclaration;
import org.eclipse.xtext.common.types.JvmVisibility;

import io.sarl.lang.sarl.SarlAgent;
import io.sarl.lang.sarl.SarlBehavior;
import io.sarl.lang.sarl.SarlSkill;
import io.sarl.lang.jvmmodel.IDefaultVisibilityProvider;

/**
* <!-- begin-user-doc -->
Expand Down Expand Up @@ -58,13 +55,7 @@ protected SarlEnumerationImplCustom() {

@Override
protected JvmVisibility getDefaultVisibility() {
final XtendTypeDeclaration declaration = getDeclaringType();
if (declaration instanceof SarlSkill
|| declaration instanceof SarlBehavior
|| declaration instanceof SarlAgent) {
return JvmVisibility.PROTECTED;
}
return super.getDefaultVisibility();
return IDefaultVisibilityProvider.getEnumerationDefaultVisibilityIn(getDeclaringType());
}

}
Expand Up @@ -21,10 +21,9 @@

package io.sarl.lang.sarl.impl;

import org.eclipse.xtend.core.xtend.XtendTypeDeclaration;
import org.eclipse.xtext.common.types.JvmVisibility;

import io.sarl.lang.sarl.SarlEvent;
import io.sarl.lang.jvmmodel.IDefaultVisibilityProvider;

/**
* <!-- begin-user-doc -->
Expand Down Expand Up @@ -56,11 +55,7 @@ protected SarlFieldImplCustom() {

@Override
protected JvmVisibility getDefaultVisibility() {
final XtendTypeDeclaration declaration = getDeclaringType();
if (declaration instanceof SarlEvent) {
return JvmVisibility.PUBLIC;
}
return super.getDefaultVisibility();
return IDefaultVisibilityProvider.getFieldDefaultVisibilityIn(getDeclaringType());
}

}
Expand Up @@ -21,12 +21,9 @@

package io.sarl.lang.sarl.impl;

import org.eclipse.xtend.core.xtend.XtendTypeDeclaration;
import org.eclipse.xtext.common.types.JvmVisibility;

import io.sarl.lang.sarl.SarlAgent;
import io.sarl.lang.sarl.SarlBehavior;
import io.sarl.lang.sarl.SarlSkill;
import io.sarl.lang.jvmmodel.IDefaultVisibilityProvider;

/**
* <!-- begin-user-doc -->
Expand Down Expand Up @@ -58,13 +55,7 @@ protected SarlInterfaceImplCustom() {

@Override
protected JvmVisibility getDefaultVisibility() {
final XtendTypeDeclaration declaration = getDeclaringType();
if (declaration instanceof SarlSkill
|| declaration instanceof SarlBehavior
|| declaration instanceof SarlAgent) {
return JvmVisibility.PROTECTED;
}
return super.getDefaultVisibility();
return IDefaultVisibilityProvider.getInterfaceDefaultVisibilityIn(getDeclaringType());
}

}

0 comments on commit 4bc7c3e

Please sign in to comment.