/******************************************************************************* * Copyright (c) 2005, 2016 IBM Corporation and others. * 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 * *******************************************************************************/ package org.eclipse.dltk.ruby.core.model.internal; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.dltk.ast.ASTNode; import org.eclipse.dltk.ast.expressions.NumericLiteral; import org.eclipse.dltk.ruby.core.model.ICalculatedType; import org.eclipse.dltk.ruby.core.model.IElement; import org.eclipse.dltk.ruby.core.model.IElementCriteria; import org.eclipse.dltk.ruby.core.model.IElementKind; import org.eclipse.dltk.ruby.core.model.IMethod; public class RubyTypeCalculator { private final Model model; public RubyTypeCalculator(Model model) { this.model = model; } public ICalculatedType calculateType(ASTNode node) { if (node instanceof NumericLiteral) { NumericLiteral expression = (NumericLiteral) node; // TODO: handle user contributions into Fixnum return createFixnum(); } return null; } private ICalculatedType createFixnum() { final ICalculatedType type = new ICalculatedType() { @Override public IElement[] findChildren(IElementCriteria criteria, String name, IProgressMonitor pm) { if (criteria == IElementCriteria.ByKind.METHOD) { final IElement typeParent = this; IElement ceil = new IMethod() { @Override public IElement[] findChildren(IElementCriteria criteria, String name, IProgressMonitor pm) { return IElement.EMPTY_ARRAY; } @Override public IElement getAncestor(IElementCriteria criteria) { if (criteria == IElementCriteria.ByKind.MODEL) return model; else if (criteria == IElementCriteria.ByKind.CLASS || criteria == IElementCriteria.CLASS_OR_MIXIN) return typeParent; return null; } @Override public IElementKind getElementKind() { return IElementKind.METHOD; } @Override public String getName() { return "ceil"; //$NON-NLS-1$ } }; return new IElement[] {ceil}; } return IElement.EMPTY_ARRAY; } @Override public IElement getAncestor(IElementCriteria criteria) { if (criteria == IElementCriteria.ByKind.MODEL) return model; return null; } @Override public IElementKind getElementKind() { return IElementKind.CLASS; } }; return type; } }