added 'Pseudocode' interface

'Pseudocode' class was renamed to 'PseudocodeImpl'
This commit is contained in:
Svetlana Isakova
2012-05-26 12:42:06 +04:00
parent b6b1ce52e1
commit f4920b7d09
2 changed files with 79 additions and 7 deletions
@@ -0,0 +1,49 @@
/*
* 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.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.cfg.Label; 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.JetElement;
import org.jetbrains.jet.lang.psi.JetExpression;
import java.util.*; import java.util.*;
/** /**
* @author abreslav * @author abreslav
* @author svtk
*/ */
public class Pseudocode { public class PseudocodeImpl implements IPseudocode {
public class PseudocodeLabel implements Label { public class PseudocodeLabel implements Label {
private final String name; private final String name;
@@ -75,6 +78,9 @@ public class Pseudocode {
private final List<Instruction> instructions = new ArrayList<Instruction>(); private final List<Instruction> instructions = new ArrayList<Instruction>();
private List<Instruction> deadInstructions; 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> labels = new ArrayList<PseudocodeLabel>();
private final List<PseudocodeLabel> allowedDeadLabels = new ArrayList<PseudocodeLabel>(); private final List<PseudocodeLabel> allowedDeadLabels = new ArrayList<PseudocodeLabel>();
private final List<PseudocodeLabel> stopAllowDeadLabels = new ArrayList<PseudocodeLabel>(); private final List<PseudocodeLabel> stopAllowDeadLabels = new ArrayList<PseudocodeLabel>();
@@ -85,16 +91,20 @@ public class Pseudocode {
private SubroutineExitInstruction errorInstruction; private SubroutineExitInstruction errorInstruction;
private boolean postPrecessed = false; private boolean postPrecessed = false;
public Pseudocode(JetElement correspondingElement) { public PseudocodeImpl(JetElement correspondingElement) {
this.correspondingElement = correspondingElement; this.correspondingElement = correspondingElement;
} }
@NotNull
@Override
public JetElement getCorrespondingElement() { public JetElement getCorrespondingElement() {
return correspondingElement; return correspondingElement;
} }
public Set<Pseudocode> getLocalDeclarations() { @NotNull
Set<Pseudocode> localDeclarations = Sets.newLinkedHashSet(); @Override
public Set<IPseudocode> getLocalDeclarations() {
Set<IPseudocode> localDeclarations = Sets.newLinkedHashSet();
//todo look recursively inside local declarations //todo look recursively inside local declarations
for (Instruction instruction : instructions) { for (Instruction instruction : instructions) {
if (instruction instanceof LocalDeclarationInstruction) { if (instruction instanceof LocalDeclarationInstruction) {
@@ -118,6 +128,7 @@ public class Pseudocode {
stopAllowDeadLabels.add((PseudocodeLabel) label); stopAllowDeadLabels.add((PseudocodeLabel) label);
} }
@Override
@NotNull @NotNull
public List<Instruction> getInstructions() { public List<Instruction> getInstructions() {
return instructions; return instructions;
@@ -129,6 +140,7 @@ public class Pseudocode {
return mutableInstructionList; return mutableInstructionList;
} }
@Override
@NotNull @NotNull
public List<Instruction> getDeadInstructions() { public List<Instruction> getDeadInstructions() {
if (deadInstructions != null) { if (deadInstructions != null) {
@@ -174,19 +186,30 @@ public class Pseudocode {
public void addInstruction(Instruction instruction) { public void addInstruction(Instruction instruction) {
mutableInstructionList.add(instruction); mutableInstructionList.add(instruction);
instruction.setOwner(this); 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 @NotNull
public SubroutineExitInstruction getExitInstruction() { public SubroutineExitInstruction getExitInstruction() {
return exitInstruction; return exitInstruction;
} }
@Override
@NotNull @NotNull
public SubroutineSinkInstruction getSinkInstruction() { public SubroutineSinkInstruction getSinkInstruction() {
return sinkInstruction; return sinkInstruction;
} }
@Override
@NotNull @NotNull
public SubroutineEnterInstruction getEnterInstruction() { public SubroutineEnterInstruction getEnterInstruction() {
return (SubroutineEnterInstruction) mutableInstructionList.get(0); return (SubroutineEnterInstruction) mutableInstructionList.get(0);
@@ -251,7 +274,7 @@ public class Pseudocode {
@Override @Override
public void visitLocalDeclarationInstruction(LocalDeclarationInstruction instruction) { public void visitLocalDeclarationInstruction(LocalDeclarationInstruction instruction) {
instruction.getBody().postProcess(); ((PseudocodeImpl)instruction.getBody()).postProcess();
instruction.setNext(getSinkInstruction()); instruction.setNext(getSinkInstruction());
} }