提交 f4920b7d 编写于 作者: S Svetlana Isakova

added 'Pseudocode' interface

'Pseudocode' class was renamed to 'PseudocodeImpl'
上级 b6b1ce52
/*
* Copyright 2010-2012 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.jet.lang.cfg.pseudocode;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.psi.JetElement;
import java.util.List;
import java.util.Set;
/**
* @author svtk
*/
public interface IPseudocode {
@NotNull
JetElement getCorrespondingElement();
@NotNull
Set<IPseudocode> getLocalDeclarations();
@NotNull
List<Instruction> getInstructions();
@NotNull
List<Instruction> getDeadInstructions();
@NotNull
SubroutineExitInstruction getExitInstruction();
@NotNull
SubroutineSinkInstruction getSinkInstruction();
@NotNull
SubroutineEnterInstruction getEnterInstruction();
}
......@@ -22,14 +22,17 @@ import com.google.common.collect.Sets;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.cfg.Label;
import org.jetbrains.jet.lang.cfg.LoopInfo;
import org.jetbrains.jet.lang.psi.JetElement;
import org.jetbrains.jet.lang.psi.JetExpression;
import java.util.*;
/**
* @author abreslav
* @author svtk
*/
public class Pseudocode {
public class PseudocodeImpl implements IPseudocode {
public class PseudocodeLabel implements Label {
private final String name;
......@@ -74,6 +77,9 @@ public class Pseudocode {
private final List<Instruction> mutableInstructionList = new ArrayList<Instruction>();
private final List<Instruction> instructions = new ArrayList<Instruction>();
private List<Instruction> deadInstructions;
final Map<JetElement, Instruction> representativeInstructions = new HashMap<JetElement, Instruction>();
final Map<JetExpression, LoopInfo> loopInfo = Maps.newHashMap();
private final List<PseudocodeLabel> labels = new ArrayList<PseudocodeLabel>();
private final List<PseudocodeLabel> allowedDeadLabels = new ArrayList<PseudocodeLabel>();
......@@ -85,16 +91,20 @@ public class Pseudocode {
private SubroutineExitInstruction errorInstruction;
private boolean postPrecessed = false;
public Pseudocode(JetElement correspondingElement) {
public PseudocodeImpl(JetElement correspondingElement) {
this.correspondingElement = correspondingElement;
}
@NotNull
@Override
public JetElement getCorrespondingElement() {
return correspondingElement;
}
public Set<Pseudocode> getLocalDeclarations() {
Set<Pseudocode> localDeclarations = Sets.newLinkedHashSet();
@NotNull
@Override
public Set<IPseudocode> getLocalDeclarations() {
Set<IPseudocode> localDeclarations = Sets.newLinkedHashSet();
//todo look recursively inside local declarations
for (Instruction instruction : instructions) {
if (instruction instanceof LocalDeclarationInstruction) {
......@@ -118,6 +128,7 @@ public class Pseudocode {
stopAllowDeadLabels.add((PseudocodeLabel) label);
}
@Override
@NotNull
public List<Instruction> getInstructions() {
return instructions;
......@@ -128,7 +139,8 @@ public class Pseudocode {
public List<Instruction> getMutableInstructionList() {
return mutableInstructionList;
}
@Override
@NotNull
public List<Instruction> getDeadInstructions() {
if (deadInstructions != null) {
......@@ -174,19 +186,30 @@ public class Pseudocode {
public void addInstruction(Instruction instruction) {
mutableInstructionList.add(instruction);
instruction.setOwner(this);
if (instruction instanceof JetElementInstruction) {
JetElementInstruction elementInstruction = (JetElementInstruction) instruction;
representativeInstructions.put(elementInstruction.getElement(), instruction);
}
}
public void recordLoopInfo(JetExpression expression, LoopInfo blockInfo) {
loopInfo.put(expression, blockInfo);
}
@Override
@NotNull
public SubroutineExitInstruction getExitInstruction() {
return exitInstruction;
}
@Override
@NotNull
public SubroutineSinkInstruction getSinkInstruction() {
return sinkInstruction;
}
@Override
@NotNull
public SubroutineEnterInstruction getEnterInstruction() {
return (SubroutineEnterInstruction) mutableInstructionList.get(0);
......@@ -251,7 +274,7 @@ public class Pseudocode {
@Override
public void visitLocalDeclarationInstruction(LocalDeclarationInstruction instruction) {
instruction.getBody().postProcess();
((PseudocodeImpl)instruction.getBody()).postProcess();
instruction.setNext(getSinkInstruction());
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册