added 'Pseudocode' interface
'Pseudocode' class was renamed to 'PseudocodeImpl'
This commit is contained in:
@@ -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();
|
||||||
|
}
|
||||||
+29
-6
@@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
Reference in New Issue
Block a user