blob: 1e548b380b178ff14994e17d3cd7b6b33af78653 [file] [log] [blame]
/*******************************************************************************
* 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.typeinference;
import org.eclipse.dltk.evaluation.types.UnknownType;
import org.eclipse.dltk.ti.DefaultTypeInferencer;
import org.eclipse.dltk.ti.EvaluatorStatistics;
import org.eclipse.dltk.ti.IPruner;
import org.eclipse.dltk.ti.goals.AbstractTypeGoal;
import org.eclipse.dltk.ti.goals.IGoal;
import org.eclipse.dltk.ti.types.IEvaluatedType;
public class RubyTypeInferencer extends DefaultTypeInferencer {
private class SimplestRubyPruner implements IPruner {
private long timeStart;
private final long timeLimit;
public SimplestRubyPruner(long timeLimit) {
super();
this.timeLimit = timeLimit;
}
public void init() {
this.timeStart = System.currentTimeMillis();
}
public boolean prune(IGoal goal, EvaluatorStatistics stat) {
long currentTime = System.currentTimeMillis();
if (timeLimit != -1 && currentTime - timeStart > timeLimit)
return true;
if (stat != null) {
if (stat.getSubGoalsDoneSuccessful() > 5)
return true;
}
return false;
}
}
public RubyTypeInferencer() {
super(new RubyEvaluatorFactory());
}
@Override
public synchronized IEvaluatedType evaluateType(AbstractTypeGoal goal,
int timeLimit) {
IEvaluatedType type = super.evaluateType(goal, new SimplestRubyPruner(
timeLimit));
if (type == null || type instanceof UnknownType) {
// All things in ruby are instances of Object
type = new RubyClassType("Object"); //$NON-NLS-1$
}
return type;
}
@Override
public synchronized Object evaluateGoal(IGoal goal, IPruner pruner) {
return super.evaluateGoal(goal, pruner);
}
}