@@ -90,12 +90,22 @@ valueToJs m e (App val args) = JSApp (valueToJs m e val) (map (valueToJs m e) ar
9090valueToJs m e (Abs args val) = JSFunction Nothing args (JSBlock [JSReturn (valueToJs m e val)])
9191valueToJs m e (Unary op val) = JSUnary op (valueToJs m e val)
9292valueToJs 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
94− Just (_, Alias aliasModule aliasIdent) -> qualifiedToJS identToJs (Qualified (Just aliasModule) aliasIdent)
95− _ -> qualifiedToJS identToJs ident
93+valueToJs m e (Var ident) = varToJs m e ident
9694valueToJs m e (TypedValue val _) = valueToJs m e val
9795valueToJs _ _ _ = error "Invalid argument to valueToJs"
9896
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+
99109qualifiedToJS :: (a -> String) -> Qualified a -> JS
100110qualifiedToJS f (Qualified (Just (ModuleName (ProperName m))) a) = JSAccessor (f a) (JSVar (Ident m))
101111qualifiedToJS f (Qualified Nothing a) = JSVar (Ident (f a))