git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Foreign imports always refer to functions defined globally
57ffe6dPhil Freeman
examples/passing/FFI.purs+8−3
@@ -1,7 +1,12 @@
1module FFI where
1module FFI where
2
2
3− foreign import foo :: String -> String
3+foreign import foo :: String -> String
4
4
5− bar :: String -> String
5+bar :: String -> String
6+bar = \x -> foo (x ++ "bar")
6
7
7− bar = \x -> foo (x ++ "bar")
8+module FFIModuleTest where
9+
10+import FFI
11+
12+baz = foo "test"
src/Language/PureScript/CodeGen/JS.hs+13−3
@@ -90,12 +90,22 @@ valueToJs m e (App val args) = JSApp (valueToJs m e val) (map (valueToJs m e) ar
90valueToJs m e (Abs args val) = JSFunction Nothing args (JSBlock [JSReturn (valueToJs m e val)])
90valueToJs m e (Abs args val) = JSFunction Nothing args (JSBlock [JSReturn (valueToJs m e val)])
91valueToJs m e (Unary op val) = JSUnary op (valueToJs m e val)
91valueToJs m e (Unary op val) = JSUnary op (valueToJs m e val)
92valueToJs m e (Binary op v1 v2) = JSBinary op (valueToJs m e v1) (valueToJs m e v2)
92valueToJs m e (Binary op v1 v2) = JSBinary op (valueToJs m e v1) (valueToJs m e v2)
93−valueToJs m e (Var ident) = case M.lookup (qualify m ident) (names e) of
93+valueToJs m e (Var ident) = varToJs m e ident
94− Just (_, Alias aliasModule aliasIdent) -> qualifiedToJS identToJs (Qualified (Just aliasModule) aliasIdent)
95− _ -> qualifiedToJS identToJs ident
96valueToJs m e (TypedValue val _) = valueToJs m e val
94valueToJs m e (TypedValue val _) = valueToJs m e val
97valueToJs _ _ _ = error "Invalid argument to valueToJs"
95valueToJs _ _ _ = error "Invalid argument to valueToJs"
98
96
97+varToJs :: ModuleName -> Environment -> Qualified Ident -> JS
98+varToJs m e qual@(Qualified _ ident) = case M.lookup (qualify m qual) (names e) of
99+ Just (_, ty) | isExtern ty -> JSVar ident
100+ Just (_, Alias aliasModule aliasIdent) -> qualifiedToJS identToJs (Qualified (Just aliasModule) aliasIdent)
101+ _ -> qualifiedToJS identToJs qual
102+ where
103+ isExtern Extern = True
104+ isExtern (Alias m' ident') = case M.lookup (m', ident') (names e) of
105+ Just (_, ty') -> isExtern ty'
106+ Nothing -> error "Undefined alias in varToJs"
107+ isExtern _ = False
108+
99qualifiedToJS :: (a -> String) -> Qualified a -> JS
109qualifiedToJS :: (a -> String) -> Qualified a -> JS
100qualifiedToJS f (Qualified (Just (ModuleName (ProperName m))) a) = JSAccessor (f a) (JSVar (Ident m))
110qualifiedToJS f (Qualified (Just (ModuleName (ProperName m))) a) = JSAccessor (f a) (JSVar (Ident m))
101qualifiedToJS f (Qualified Nothing a) = JSVar (Ident (f a))
111qualifiedToJS f (Qualified Nothing a) = JSVar (Ident (f a))