/*******************************************************************************
* Copyright (c) 2013 Bruno Medeiros and other Contributors.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Bruno Medeiros - initial API and implementation
*******************************************************************************/
package melnorme.lang.tooling.engine.intrinsics;
import static melnorme.utilbox.core.Assert.AssertNamespace.assertFail;
import static melnorme.utilbox.core.Assert.AssertNamespace.assertNotNull;
import dtool.ast.definitions.EArcheType;
import melnorme.lang.tooling.ast_actual.ElementDoc;
import melnorme.lang.tooling.context.ISemanticContext;
import melnorme.lang.tooling.engine.PickedElement;
import melnorme.lang.tooling.engine.resolver.IReference;
import melnorme.lang.tooling.engine.resolver.TypeSemantics;
import melnorme.lang.tooling.engine.resolver.VarSemantics;
import melnorme.lang.tooling.engine.scoping.NamedElementsScope;
import melnorme.lang.tooling.symbols.AbstractNamedElement;
import melnorme.lang.tooling.symbols.IConcreteNamedElement;
import melnorme.lang.tooling.symbols.INamedElement;
public interface CommonLanguageIntrinsics {
public abstract class IntrinsicNamedElement extends AbstractNamedElement {
public IntrinsicNamedElement(String name, ElementDoc doc) {
super(name, null, null, doc);
}
}
public abstract class BuiltinTypeElement extends IntrinsicNamedElement implements IConcreteNamedElement {
protected NamedElementsScope membersScope;
public BuiltinTypeElement(String name, ElementDoc doc) {
super(name, doc);
}
@Override
public EArcheType getArcheType() {
return EArcheType.Struct;
}
public NamedElementsScope getMembersScope() {
return membersScope;
}
@Override
public String toString() {
return "intrinsic_type#" + getName();
}
public final void createMembers(IntrinsicNamedElement... members) {
doCreateMembers(members);
setElementReady();
}
public abstract void doCreateMembers(IntrinsicNamedElement... members);
@Override
public TypeSemantics getSemantics(ISemanticContext parentContext) {
return (TypeSemantics) super.getSemantics(parentContext);
}
@Override
public TypeSemantics doCreateSemantics(PickedElement<?> pickedElement) {
return new TypeSemantics(this, pickedElement, membersScope);
}
}
public abstract class AbstractIntrinsicProperty extends IntrinsicNamedElement implements IConcreteNamedElement {
public AbstractIntrinsicProperty(String name, ElementDoc doc) {
super(name, doc);
}
@Override
public EArcheType getArcheType() {
return EArcheType.Variable;
}
@Override
public String toString() {
return "intrinsic_property#" + getName();
}
protected abstract INamedElement resolveType(ISemanticContext context);
@Override
public VarSemantics doCreateSemantics(PickedElement<?> pickedElement) {
return new VarSemantics(this, pickedElement) {
@Override
public INamedElement getTypeForValueContext_do() {
return resolveType(context);
};
@Override
protected IReference getTypeReference() {
throw assertFail();
};
};
}
}
public class IntrinsicProperty extends AbstractIntrinsicProperty {
public final INamedElement type;
public IntrinsicProperty(String name, INamedElement type, ElementDoc doc) {
super(name, doc);
this.type = assertNotNull(type);
setElementReady();
}
@Override
protected void doSetElementSemanticReady() {
/* TODO: enable assertTrue(type.isSemanticReady()) */
//assertTrue(type.isSemanticReady());
}
@Override
protected INamedElement resolveType(ISemanticContext context) {
return type;
}
}
public interface IPrimitiveDefUnit { }
/* ----------------- refs ----------------- */
public class IntrinsicProperty2 extends AbstractIntrinsicProperty {
public final IReference typeRef;
public IntrinsicProperty2(String name, IReference typeRef, ElementDoc doc) {
super(name, doc);
this.typeRef = assertNotNull(typeRef);
setElementReady();
}
@Override
protected void doSetElementSemanticReady() {
/* TODO: enable assertTrue(type.isSemanticReady()) */
// assertTrue(typeRef.isSemanticReady());
}
@Override
protected INamedElement resolveType(ISemanticContext context) {
return typeRef.getSemantics(context).resolveTargetElement().result;
}
}
}