%%
%% %CopyrightBegin%
%% 
%% Copyright Ericsson AB 2000-2015. All Rights Reserved.
%% 
%% 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.
%% 
%% %CopyrightEnd%
%%

%%% This file is meant to be included by xref_* only.

-define(VAR_EXPR, '$F_EXPR').
-define(MOD_EXPR, '$M_EXPR').

-define(XREF_END_LINE, (1 bsl 23)).

%%% Filenames are stored as directory and basename. A lot of heap can
%%% be saved by keeping only one (or few) copy of the directory name.

%% 'data' in xref_mod holds "raw" data (as sets) for each module. The
%% data in 'variables' is derived from raw data.
-record(xref, {
	  version = 1,                  % version of the xref record
	  mode = functions,
	  variables = not_set_up,       % table of variables

	  modules = dict:new(),         % dict-of(xref_mod())
	  applications = dict:new(),    % dict-of(xref_app())
	  releases = dict:new(),        % dict-of(xref_rel())

	  library_path = [],         % [string()] | code_path
	  libraries = dict:new(),    % dict-of(xref_lib())

	  builtins_default = false,  % Default value of the 'builtins' option.
	  recurse_default = false,   % Default value of the 'recurse' option.
	  verbose_default = false,   % Default value of the 'verbose' option.
	  warnings_default = true    % Default value of the 'warnings' option.
	  }).

-record(xref_mod, {
	  name = '',
	  app_name = [],     % [] or [AppName]
	  dir = "",          % string(), directory where the BEAM file resides
	  mtime,             % modification time for file
	  builtins,          % whether calls to built-in functions are included
	  info,              % number of exports, locals etc.
	  no_unresolved = 0, % number of unresolved calls
	  data               
	  %% Data has been read from the BEAM file, and is represented here
          %% as a list of sets.
	  %% If xref.mode = functions:
          %% [
	  %% DefAt,         M -> P(V * N)
	  %% L,             M -> P(V)
	  %% X,             M -> P(V)
	  %% LCallAt,       M -> P(V * V -> P(N))
	  %% XCallAt,       M -> P(V * V -> P(N))
	  %% CallAt,        M -> P(V * V -> P(N))
	  %% LC,            M -> P(V * V)
	  %% XC,            M -> P(V * V)
	  %% LU,            M -> P(V)
	  %% EE,            M -> P(EV * EV)
	  %% ECallAt,       M -> P(EV * EV -> P(N))
	  %% Unres,         M -> P(V * V)
	  %% LPredefined    M -> P(V)
          %% ]
	  %%
	  %% If xref.mode = modules:
          %% [
	  %% X,             M -> P(V)
	  %% I              M -> P(V)
          %% ]
	  }).

-record(xref_app, {
	  name = '',
	  rel_name = [], % [] or [RelName]
	  vsn = [],
	  dir = ""     % where BEAM files are read from
	  }).

-record(xref_rel, {
	  name = '',
	  dir = ""     % where application directories reside
	  }).

-record(xref_lib, {
	  name = '',   % atom(), module name 
	  dir = ""     % string(), directory where the file resides
	  }).

-record(xref_var, {
	  name = '',   % atom(), variable name
	  value,       % set or pair of sets, variable value
	  vtype,       % VarType (predef, tmp, user)
	  otype,       % ObjectType (vertex, edge, etc.)
	  type         % Type (function, module, etc.)
	  }).