Skip to content

Commit

Permalink
Merge pull request #3858 from JacquesCarette/PyConsts
Browse files Browse the repository at this point in the history
Made `constDecDef` capitalize constants in Python
  • Loading branch information
JacquesCarette authored Jul 24, 2024
2 parents d0f9e1d + c5d05e7 commit 07f5b17
Show file tree
Hide file tree
Showing 24 changed files with 143 additions and 106 deletions.
19 changes: 10 additions & 9 deletions code/drasil-code/lib/Language/Drasil/Code/Imperative/Import.hs
Original file line number Diff line number Diff line change
Expand Up @@ -40,14 +40,15 @@ import qualified Language.Drasil.Mod as M (Class(..))
import Drasil.GOOL (Label, SFile, MSBody, MSBlock, VSType, SVariable, SValue,
MSStatement, MSParameter, SMethod, CSStateVar, SClass, NamedArgs,
Initializers, OOProg, PermanenceSym(..), bodyStatements, BlockSym(..),
TypeSym(..), VariableSym(..), var, ScopeSym(..), OOVariableSym(..), staticVar,
VariableElim(..), ($->), ValueSym(..), Literal(..), VariableValue(..),
NumericExpression(..), BooleanExpression(..), Comparison(..),
ValueExpression(..), OOValueExpression(..), objMethodCallMixedArgs, List(..),
StatementSym(..), AssignStatement(..), DeclStatement(..), IOStatement(..),
StringStatement(..), ControlStatement(..), ifNoElse, VisibilitySym(..),
ParameterSym(..), MethodSym(..), OOMethodSym(..), pubDVar, privDVar,
nonInitConstructor, convTypeOO, VisibilityTag(..), CodeType(..), onStateValue)
TypeSym(..), VariableSym(..), var, ScopeSym(..), OOVariableSym(..),
staticConst, VariableElim(..), ($->), ValueSym(..), Literal(..),
VariableValue(..), NumericExpression(..), BooleanExpression(..),
Comparison(..), ValueExpression(..), OOValueExpression(..),
objMethodCallMixedArgs, List(..), StatementSym(..), AssignStatement(..),
DeclStatement(..), IOStatement(..), StringStatement(..), ControlStatement(..),
ifNoElse, VisibilitySym(..), ParameterSym(..), MethodSym(..), OOMethodSym(..),
pubDVar, privDVar, nonInitConstructor, convTypeOO, VisibilityTag(..),
CodeType(..), onStateValue)
import qualified Drasil.GOOL as C (CodeType(List, Array))

import Prelude hiding (sin, cos, tan, log, exp)
Expand Down Expand Up @@ -100,7 +101,7 @@ variable s t scp = do
g <- get
let cs = codeSpec g
defFunc Var = \nm tp -> var nm tp scp
defFunc Const = staticVar
defFunc Const = staticConst
if s `elem` map codeName (inputs cs)
then inputVariable (inStruct g) Var (var s t scp)
else if s `elem` map codeName (constants $ codeSpec g)
Expand Down
1 change: 1 addition & 0 deletions code/drasil-code/test/HelloWorld.hs
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,7 @@ helloIfBody = addComments "If body" (body [
-- objDecDef (mainVar "myObj" char) (litChar 'o'), -- This isn't compatible with procedural renderers. TODO: split this file up
constDecDef (constant "myConst" string mainFn) (litString "Imconstant"),

printLn (valueOf $ constant "myConst" string mainFn),
printLn (valueOf $ mainVar "a" int),
printLn (valueOf $ mainVar "b" int),
printLn (valueOf $ mainVar "c" int),
Expand Down
46 changes: 23 additions & 23 deletions code/drasil-gool/lib/Drasil/GOOL.hs
Original file line number Diff line number Diff line change
Expand Up @@ -11,23 +11,23 @@ module Drasil.GOOL (Label, GSProgram, SFile, MSBody, MSBlock, VSType,
FuncAppStatement(..), OOFuncAppStatement(..), CommentStatement(..),
initObserverList, addObserver, ControlStatement(..), ifNoElse, switchAsIf,
VariableSym(..), var, constant, locVar, mainVar, ScopeSym(..),
OOVariableSym(..), VariableElim(..), ($->), listOf, listVar, ValueSym(..),
Argument(..), Literal(..), MathConstant(..), VariableValue(..),
OOVariableValue, CommandLineArgs(..), NumericExpression(..),
BooleanExpression(..), Comparison(..), ValueExpression(..),
OOValueExpression(..), funcApp, funcAppNamedArgs, selfFuncApp, extFuncApp,
libFuncApp, newObj, extNewObj, libNewObj, exists, objMethodCall,
objMethodCallNamedArgs, objMethodCallMixedArgs, objMethodCallNoParams,
FunctionSym(..), OOFunctionSym(..), ($.), selfAccess, GetSet(..), List(..),
listSlice, listIndexExists, at, ObserverPattern(..), StrategyPattern(..),
VisibilitySym(..), ParameterSym(..), MethodSym(..), OOMethodSym(..),
privMethod, pubMethod, initializer, nonInitConstructor, StateVarSym(..),
privDVar, pubDVar, pubSVar, ClassSym(..), ModuleSym(..), convType, convTypeOO,
ProgData(..), FileData(..), ModData(..), VisibilityTag(..), CodeType(..),
GOOLState(..), lensMStoVS, headers, sources, mainMod, initialState,
onStateValue, onCodeList, unCI, unPC, unJC, unCSC, unCPPC, unSC, unJLC,
pyName, pyVersion, jName, jVersion, csName, csVersion, cppName, cppVersion,
swiftName, swiftVersion, jlName, jlVersion
OOVariableSym(..), staticVar, staticConst, VariableElim(..), ($->), listOf,
listVar, ValueSym(..), Argument(..), Literal(..), MathConstant(..),
VariableValue(..), OOVariableValue, CommandLineArgs(..),
NumericExpression(..), BooleanExpression(..), Comparison(..),
ValueExpression(..), OOValueExpression(..), funcApp, funcAppNamedArgs,
selfFuncApp, extFuncApp, libFuncApp, newObj, extNewObj, libNewObj, exists,
objMethodCall, objMethodCallNamedArgs, objMethodCallMixedArgs,
objMethodCallNoParams, FunctionSym(..), OOFunctionSym(..), ($.), selfAccess,
GetSet(..), List(..), listSlice, listIndexExists, at, ObserverPattern(..),
StrategyPattern(..), VisibilitySym(..), ParameterSym(..), MethodSym(..),
OOMethodSym(..), privMethod, pubMethod, initializer, nonInitConstructor,
StateVarSym(..), privDVar, pubDVar, pubSVar, ClassSym(..), ModuleSym(..),
convType, convTypeOO, ProgData(..), FileData(..), ModData(..),
VisibilityTag(..), CodeType(..), GOOLState(..), lensMStoVS, headers, sources,
mainMod, initialState, onStateValue, onCodeList, unCI, unPC, unJC, unCSC,
unCPPC, unSC, unJLC, pyName, pyVersion, jName, jVersion, csName, csVersion,
cppName, cppVersion, swiftName, swiftVersion, jlName, jlVersion
) where

import Drasil.GOOL.InterfaceCommon (Label, MSBody, MSBlock, VSFunction, VSType,
Expand All @@ -46,12 +46,12 @@ import Drasil.GOOL.InterfaceCommon (Label, MSBody, MSBlock, VSFunction, VSType,
listIndexExists, at, ScopeSym(..), ParameterSym(..), MethodSym(..),
VisibilitySym(..), convType)
import Drasil.GOOL.InterfaceGOOL (GSProgram, SFile, FSModule, SClass,
CSStateVar, OOProg, ProgramSym(..), FileSym(..), ModuleSym(..), ClassSym(..),
OOMethodSym(..), Initializers, OOTypeSym(..), OOVariableSym(..), ($->),
PermanenceSym(..), privMethod, pubMethod, initializer, nonInitConstructor,
StateVarSym(..), privDVar, pubDVar, pubSVar, OOVariableValue,
OOValueExpression(..), selfFuncApp, newObj, extNewObj, libNewObj,
OODeclStatement(..), objDecNewNoParams, extObjDecNewNoParams,
CSStateVar, Initializers, OOProg, ProgramSym(..), FileSym(..), ModuleSym(..),
ClassSym(..), OOMethodSym(..), OOTypeSym(..), OOVariableSym(..), staticVar,
staticConst, ($->), PermanenceSym(..), privMethod, pubMethod, initializer,
nonInitConstructor, StateVarSym(..), privDVar, pubDVar, pubSVar,
OOVariableValue, OOValueExpression(..), selfFuncApp, newObj, extNewObj,
libNewObj, OODeclStatement(..), objDecNewNoParams, extObjDecNewNoParams,
OOFuncAppStatement(..), GetSet(..), objMethodCall, objMethodCallNamedArgs,
objMethodCallMixedArgs, objMethodCallNoParams, OOFunctionSym(..), ($.),
selfAccess, ObserverPattern(..), initObserverList, addObserver,
Expand Down
12 changes: 6 additions & 6 deletions code/drasil-gool/lib/Drasil/GOOL/CodeInfo.hs
Original file line number Diff line number Diff line change
Expand Up @@ -119,12 +119,12 @@ instance VariableSym CodeInfo where
arrayElem _ _ = noInfo

instance OOVariableSym CodeInfo where
staticVar _ _ = noInfo
self = noInfo
classVar _ _ = noInfo
extClassVar _ _ = noInfo
objVar _ _ = noInfo
objVarSelf _ = noInfo
staticVar' _ _ _ = noInfo
self = noInfo
classVar _ _ = noInfo
extClassVar _ _ = noInfo
objVar _ _ = noInfo
objVarSelf _ = noInfo

instance VariableElim CodeInfo where
variableName _ = ""
Expand Down
15 changes: 11 additions & 4 deletions code/drasil-gool/lib/Drasil/GOOL/InterfaceGOOL.hs
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ module Drasil.GOOL.InterfaceGOOL (
GSProgram, SFile, FSModule, SClass, CSStateVar, Initializers,
-- Typeclasses
OOProg, ProgramSym(..), FileSym(..), ModuleSym(..), ClassSym(..),
OOTypeSym(..), OOVariableSym(..), ($->), OOValueSym, OOVariableValue,
OOValueExpression(..), selfFuncApp, newObj, extNewObj, libNewObj,
OODeclStatement(..), objDecNewNoParams, extObjDecNewNoParams,
OOTypeSym(..), OOVariableSym(..), staticVar, staticConst, ($->), OOValueSym,
OOVariableValue, OOValueExpression(..), selfFuncApp, newObj, extNewObj,
libNewObj, OODeclStatement(..), objDecNewNoParams, extObjDecNewNoParams,
OOFuncAppStatement(..), GetSet(..), InternalValueExp(..), objMethodCall,
objMethodCallNamedArgs, objMethodCallMixedArgs, objMethodCallNoParams,
OOMethodSym(..), privMethod, pubMethod, initializer, nonInitConstructor,
Expand Down Expand Up @@ -132,13 +132,20 @@ class (TypeSym r) => OOTypeSym r where
class (ValueSym r, OOTypeSym r) => OOValueSym r

class (VariableSym r, OOTypeSym r) => OOVariableSym r where
staticVar :: Label -> VSType r -> SVariable r
-- Bool: False for variable, True for constant. Required by the Python renderer.
staticVar' :: Bool -> Label -> VSType r -> SVariable r
self :: SVariable r
classVar :: VSType r -> SVariable r -> SVariable r
extClassVar :: VSType r -> SVariable r -> SVariable r
objVar :: SVariable r -> SVariable r -> SVariable r
objVarSelf :: SVariable r -> SVariable r

staticVar :: (OOVariableSym r) => Label -> VSType r -> SVariable r
staticVar = staticVar' False

staticConst :: (OOVariableSym r) => Label -> VSType r -> SVariable r
staticConst = staticVar' True

($->) :: (OOVariableSym r) => SVariable r -> SVariable r -> SVariable r
infixl 9 $->
($->) = objVar
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -281,7 +281,7 @@ instance VariableSym CSharpCode where
arrayElem i = G.arrayElem (litInt i)

instance OOVariableSym CSharpCode where
staticVar = G.staticVar
staticVar' _ = G.staticVar
self = C.self
classVar = CP.classVar R.classVar
extClassVar = classVar
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -290,7 +290,7 @@ instance (Pair p) => VariableSym (p CppSrcCode CppHdrCode) where
arrayElem i = pair1 (arrayElem i) (arrayElem i)

instance (Pair p) => OOVariableSym (p CppSrcCode CppHdrCode) where
staticVar n = pair1 (staticVar n) (staticVar n)
staticVar' c n = pair1 (staticVar' c n) (staticVar' c n)
self = on2StateValues pair self self
classVar = pair2 classVar classVar
extClassVar = pair2 extClassVar extClassVar
Expand Down Expand Up @@ -1187,7 +1187,7 @@ instance VariableSym CppSrcCode where
arrayElem i = G.arrayElem (litInt i)

instance OOVariableSym CppSrcCode where
staticVar = G.staticVar
staticVar' _ = G.staticVar
self = C.self
classVar c' v'= do
c <- c'
Expand Down Expand Up @@ -1898,7 +1898,7 @@ instance VariableSym CppHdrCode where
arrayElem _ _ = mkStateVar "" void empty

instance OOVariableSym CppHdrCode where
staticVar = G.staticVar
staticVar' _ = G.staticVar
self = mkStateVar "" void empty
classVar _ _ = mkStateVar "" void empty
extClassVar _ _ = mkStateVar "" void empty
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -288,7 +288,7 @@ instance VariableSym JavaCode where
arrayElem i = G.arrayElem (litInt i)

instance OOVariableSym JavaCode where
staticVar = G.staticVar
staticVar' _ = G.staticVar
self = C.self
classVar = CP.classVar R.classVar
extClassVar = classVar
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1034,7 +1034,7 @@ instance OOTypeSym JuliaCode where
obj = undefined--

instance OOVariableSym JuliaCode where
staticVar = undefined--
staticVar' = undefined--
self = undefined--
classVar = undefined--
extClassVar = undefined--
Expand Down
43 changes: 30 additions & 13 deletions code/drasil-gool/lib/Drasil/GOOL/LanguageRenderer/PythonRenderer.hs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import Utils.Drasil (blank, indent)
import Drasil.GOOL.CodeType (CodeType(..))
import Drasil.GOOL.InterfaceCommon (SharedProg, Label, Library, VSType,
VSFunction, SVariable, SValue, MSStatement, MixedCtorCall, BodySym(..),
BlockSym(..), TypeSym(..), TypeElim(..), VariableSym(..), locVar,
BlockSym(..), TypeSym(..), TypeElim(..), VariableSym(..), locVar, constant,
VisibilitySym(..), VariableElim(..), ValueSym(..), Argument(..), Literal(..),
litZero, MathConstant(..), VariableValue(..), CommandLineArgs(..),
NumericExpression(..), BooleanExpression(..), Comparison(..),
Expand Down Expand Up @@ -55,10 +55,10 @@ import Drasil.GOOL.LanguageRenderer (classDec, dot, ifLabel, elseLabel,
import qualified Drasil.GOOL.LanguageRenderer as R (sqrt, fabs, log10,
log, exp, sin, cos, tan, asin, acos, atan, floor, ceil, multiStmt, body,
classVar, listSetFunc, castObj, dynamic, break, continue, addComments,
commentedMod, commentedItem)
commentedMod, commentedItem, var)
import Drasil.GOOL.LanguageRenderer.Constructors (mkStmtNoEnd, mkStateVal,
mkVal, mkStateVar, VSOp, unOpPrec, powerPrec, multPrec, andPrec, orPrec,
unExpr, unExpr', typeUnExpr, binExpr, typeBinExpr)
unExpr, unExpr', typeUnExpr, binExpr, typeBinExpr, mkStaticVar)
import qualified Drasil.GOOL.LanguageRenderer.LanguagePolymorphic as G (
multiBody, block, multiBlock, listInnerType, obj, negateOp, csc, sec, cot,
equalOp, notEqualOp, greaterOp, greaterEqualOp, lessOp, lessEqualOp, plusOp,
Expand Down Expand Up @@ -88,11 +88,12 @@ import Drasil.GOOL.AST (Terminator(..), FileType(..), FileData(..), fileD,
td, ValData(..), vd, VarData(..), vard, CommonThunk, pureValue, vectorize,
vectorize2, sumComponents, commonVecIndex, commonThunkElim, commonThunkDim)
import Drasil.GOOL.Helpers (vibcat, emptyIfEmpty, toCode, toState, onCodeValue,
onStateValue, on2CodeValues, on2StateValues, onCodeList, onStateList, on2StateWrapped)
import Drasil.GOOL.State (MS, VS, lensGStoFS, lensMStoVS, lensVStoMS,
revFiles, addLangImportVS, getLangImports, addLibImportVS,
getLibImports, addModuleImport, addModuleImportVS, getModuleImports,
setFileType, getClassName, setCurrMain, getClassMap, getMainDoc, genLoopIndex)
onStateValue, on2CodeValues, on2StateValues, onCodeList, onStateList,
on2StateWrapped)
import Drasil.GOOL.State (MS, VS, lensGStoFS, lensMStoVS, lensVStoMS, revFiles,
addLangImportVS, getLangImports, addLibImportVS, getLibImports, addModuleImport,
addModuleImportVS, getModuleImports, setFileType, getClassName, setCurrMain,
getClassMap, getMainDoc, genLoopIndex, varNameAvailable)

import Prelude hiding (break,print,sin,cos,tan,floor,(<>))
import Data.Maybe (fromMaybe)
Expand All @@ -101,6 +102,7 @@ import Control.Lens.Zoom (zoom)
import Control.Monad (join)
import Control.Monad.State (modify)
import Data.List (intercalate, sort)
import Data.Char (toUpper, isUpper, isLower)
import qualified Data.Map as Map (lookup)
import Text.PrettyPrint.HughesPJ (Doc, text, (<>), (<+>), parens, empty, equals,
vcat, colon, brackets, isEmpty, quotes)
Expand Down Expand Up @@ -268,13 +270,14 @@ instance ScopeSym PythonCode where

instance VariableSym PythonCode where
type Variable PythonCode = VarData
var' n _ = G.var n
constant' = var'
var' n _ = G.var n
constant' n = var' $ toConstName n
extVar l n t = modify (addModuleImportVS l) >> CP.extVar l n t
arrayElem i = G.arrayElem (litInt i)
arrayElem i = G.arrayElem (litInt i)

instance OOVariableSym PythonCode where
staticVar = G.staticVar
staticVar' c n t = if c then mkStaticVar n t (R.var (toConstName n))
else G.staticVar n t
self = zoom lensVStoMS getClassName >>= (\l -> mkStateVar pySelf (obj l) (text pySelf))
classVar = CP.classVar R.classVar
extClassVar c v = join $ on2StateValues (\t cm -> maybe id ((>>) . modify .
Expand Down Expand Up @@ -544,7 +547,14 @@ instance DeclStatement PythonCode where
listDecDef = CP.listDecDef
arrayDec = listDec
arrayDecDef = listDecDef
constDecDef = varDecDef
constDecDef v e = do
v' <- zoom lensMStoVS v
let n = toConstName $ variableName v'
newConst = constant n (pure (variableType v')) local -- TODO: get scope from v
available <- varNameAvailable n
if available
then varDecDef newConst e
else error "Cannot safely capitalize constant."
funcDecDef = CP.funcDecDef

instance OODeclStatement PythonCode where
Expand Down Expand Up @@ -1022,3 +1032,10 @@ pyDocComment :: [String] -> Doc -> Doc -> Doc
pyDocComment [] _ _ = empty
pyDocComment (l:lns) start mid = vcat $ start <+> text l : map ((<+>) mid .
text) lns

toConstName :: String -> String
toConstName (s:s':ss) = if isLower s && isUpper s'
then toUpper s : '_' : s' : toConstName ss
else toUpper s : toConstName (s' : ss)
toConstName (s:ss) = toUpper s : toConstName ss
toConstName "" = ""
Original file line number Diff line number Diff line change
Expand Up @@ -287,7 +287,7 @@ instance VariableSym SwiftCode where
arrayElem i = G.arrayElem (litInt i)

instance OOVariableSym SwiftCode where
staticVar = G.staticVar
staticVar' _ = G.staticVar
self = CP.self
classVar = CP.classVar R.classVar
extClassVar = classVar
Expand Down
7 changes: 6 additions & 1 deletion code/drasil-gool/lib/Drasil/GOOL/State.hs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ module Drasil.GOOL.State (
getCurrMainFunc, setThrowUsed, getThrowUsed, setErrorDefined, getErrorDefined,
addIter, getIter, resetIter, incrementLine, incrementWord, getLineIndex,
getWordIndex, resetIndices, useVarName, genVarName, genLoopIndex,
genVarNameIf
genVarNameIf, varNameAvailable
) where

import Drasil.GOOL.AST (FileType(..), VisibilityTag(..), QualifiedName, qualName)
Expand Down Expand Up @@ -575,6 +575,11 @@ genVarNameIf True n = genVarName [] n
genVarNameIf False _ = do
return ""

varNameAvailable :: String -> MS Bool
varNameAvailable n = do
used <- gets (^. varNames)
return $ isNothing $ Map.lookup n used

-- Helpers

ifElemError :: (Eq a) => a -> [a] -> String -> [a]
Expand Down
2 changes: 1 addition & 1 deletion code/stable/dblpend/src/python/Constants.py

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions code/stable/gooltest/cpp/HelloWorld/HelloWorld.cpp

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions code/stable/gooltest/csharp/HelloWorld/HelloWorld.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions code/stable/gooltest/julia/HelloWorld/HelloWorld.jl

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion code/stable/gooltest/python/HelloWorld/HelloWorld.py

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions code/stable/gooltest/swift/HelloWorld/main.swift

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion code/stable/pdcontroller/src/python/Calculations.py

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 07f5b17

Please sign in to comment.